Apache IoTDB查询结果转JSONObject缺失max/min/count字段如何解决?
问题分析与解决办法
这不是Bug,核心原因是你处理JDBC结果集时,没正确匹配聚合函数对应的列名。IoTDB里聚合查询的列名不是单纯的max/min/count,而是带原函数表达式的名称,直接用短名称去取JSONObject自然拿不到值。
正确处理步骤
先确认结果集的实际列名
转换之前先打印结果集元数据,搞清楚聚合字段对应的真实列名:ResultSetMetaData metaData = rs.getMetaData(); int colNum = metaData.getColumnCount(); for (int i = 1; i <= colNum; i++) { System.out.println("实际列名:" + metaData.getColumnName(i)); }比如你执行
select max(temp), min(temp), count(temp) from root.sg.device,实际列名会是max(temp)、min(temp)、count(temp),不是你以为的max这类短名称。用SQL别名固定列名(推荐)
写SQL时给聚合函数加别名,让列名更规整,后续处理更省心:select max(temp) as max_temp, min(temp) as min_temp, count(temp) as count_temp from root.sg.device之后转换JSONObject时,直接用
max_temp、min_temp、count_temp作为key取值就行。正确转换结果集到JSONObject
基于确认后的列名(或别名),遍历结果集逐行存入JSONObject:JSONObject jsonObj = new JSONObject(); while (rs.next()) { for (int i = 1; i <= colNum; i++) { String colName = metaData.getColumnName(i); jsonObj.put(colName, rs.getObject(i)); } }这样就能保证所有聚合字段都被正确写入JSONObject。
额外提醒
如果用ORM框架或第三方工具转结果集,要检查工具是否能正确识别聚合列名,必要时手动配置列名映射关系。
内容的提问来源于stack exchange,提问作者Hester Tso
相关产品推荐
相关产品推荐

