我正在使用 sprigboot 和 influx 客户端:https://github.com/influxdata/influxdb-java
我面临一个问题,我试图从流入数据库获取指定列,但当我将列名放入查询中时,我无法获取任何记录。但是,当我尝试使用 select * 时我正在获取数据。
@Data
@Measurement(name = "layout")
public class LayoutMapper {
@Column(name = "id", tag=true)
private String id;
@Column(name = "linename", tag=true)
private String lineName;
@Column(name = "tenantid")
private String tenantName;
@Column(name = "layout")
private String layout;
}
将 POJO 保存到数据库:
Point point = Point.measurementByPOJO(clazz.getClass()).addFieldsFromPOJO(pojoObject).build();
connection.query(new Query("CREATE RETENTION POLICY " + retentionPolicyName + " ON " + dbProperties.getDatabase() DURATION 1h REPLICATION 1 DEFAULT"));
connection.write(dbProperties.getDatabase(), retentionPolicyName, point);
工作:
select * from layout;
select layout from layout;
不工作(提供空记录):
select linename from layout;
有人可以建议我做错了什么吗?
注意:观察很奇怪,我们无法对字符串列进行选择查询,有什么建议吗?
最佳答案
我认为 influxdb-java 客户端库创建访问数据的抽象的方法有点令人困惑。首先,这些实际上都不是列。在 InfluxDB 中,您的数据使用以下数据模型(也称为线路协议(protocol))存储:measurement-name,tag-set field-set timestamp
“测量”是数据的高级分组,它是字符串,“标签集”是数据的集合键/值对,可以被视为元数据,其中所有值都是索引和字符串,并且“字段集”是键的集合/value 对,其中值可以是 int64、float64、bool 或 string。与标签相反,字段没有索引。
在LayoutMapper
类中,为id
和linename
设置tag=true
,这意味着这些两个是测量中标签集的成员。标签用于以高性能方式查询字段。因此,它们通常位于 WHERE 子句中,而不是单独位于 SELECT 中。
在 InfluxDB 中,如果要返回特定标签,则 SELECT 子句必须至少包含一个字段。这就是为什么您只能从包含 *
和 layout
字段的查询中获得结果。总而言之,请尝试以下操作:
SELECT layout, linename FROM layout;
关于java - 无法从 Influx 数据库检索列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58199224/