IoTDB在springboot2中的(二) 查询
上一章我们处理的基本的构建接入,以及插入的处理,那么接下来我们进行查询的操作处理。
我们继续在IoTDBSessionConfig工具类中加入查询的方法处理
/*** description: 根据SQL查询最新一条数据* author:zgy* @param sql sql查询语句,count查询语句,一般为count(id) as ct 必须加as* @return*/public Map<String,Object> queryMapData(String sql) {Map<String,Object> rtMap = new HashMap<>();try {SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);List<String> columnNames = sessionDataSetWrapper.getColumnNames();List<Map<String,Object>> rtList = packagingData(sessionDataSetWrapper,columnNames);if(!rtList.isEmpty()){rtMap = rtList.get(0);}}catch (Exception e) {logger.error("查询Map返回数据集数据异常,异常SQL>{};:{}",sql,e.toString());}return rtMap;}/*** description: 根据SQL查询最新一条数据* author:zgy* @param sql sql查询语句,查询条件最前面加 last* @param clazz 类* @return*/public IoTDBRecordable queryLastData(String sql, Class<? extends IoTDBRecordable> clazz) {Map<String,Object> rtMap = new HashMap<>();try {IoTTableName iotTableName = clazz.getAnnotation(IoTTableName.class);String tableName = iotTableName.value();SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);List<String> columnNames = sessionDataSetWrapper.getColumnNames().subList(1,sessionDataSetWrapper.getColumnNames().size());List<Map<String,Object>> rtList = packagingData(sessionDataSetWrapper,columnNames);for(Map<String,Object> map : rtList){if(map.get(TIMESERIES)!=null){rtMap.put(map.get(TIMESERIES).toString().replace(tableName+".",""),map.get("Value"));}}}catch (Exception e) {logger.error(MSG_SQL,clazz,sql,e.toString());}return JSON.parseObject(JSON.toJSONString(rtMap),clazz);}/*** description: 根据SQL查询最新一条数据* author:zgy* @param sql sql查询语句,查询条件最前面加 last* @param tableName IoTDB表名* @return*/public Map<String,Object> queryLastData(String sql,String tableName) {Map<String,Object> rtMap = new HashMap<>();try {SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);List<String> columnNames = sessionDataSetWrapper.getColumnNames().subList(1,sessionDataSetWrapper.getColumnNames().size());List<Map<String,Object>> rtList = packagingData(sessionDataSetWrapper,columnNames);for(Map<String,Object> map : rtList){if(map.get(TIMESERIES)!=null){rtMap.put(map.get(TIMESERIES).toString().replace(tableName+".",""),map.get("Value"));}}}catch (Exception e) {logger.error(MSG_SQL,tableName,sql,e.toString());}return rtMap;}/*** description: 根据SQL查询* author: zgy* @param sql sql查询语句* @param clazz 类.* @return*/public List<?> queryListData(String sql, Class<? extends IoTDBRecordable> clazz) {List<IoTDBRecordable> rtList = new ArrayList<>();try {//获取实体类注释表名IoTTableName iotTableName = clazz.getAnnotation(IoTTableName.class);String tableName = iotTableName.value();//获取查询条件是否是*全查String selectParam = sql.substring(6, sql.indexOf("from")).trim();SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);List<String> columnNames = sessionDataSetWrapper.getColumnNames();//判断如果第一个列值为Time时间戳去掉if(Objects.equals(columnNames.get(0),"Time")){columnNames.remove(0);}List<Map<String,Object>> list = packagingData(sessionDataSetWrapper,columnNames);for(Map<String,Object> map : list){//如果是*全查需要进行key值得转换if(Objects.equals("*",selectParam)){Map<String,Object> rtMap = new HashMap<>();//循环进行key值得转换for(Map.Entry<String,Object> it : map.entrySet()){rtMap.put(it.getKey().replace(tableName+".",""),it.getValue());}//map转换实体rtList.add(JSON.parseObject(JSON.toJSONString(rtMap),clazz));}else{//如果不为*则依照别名来查//map转换实体rtList.add(JSON.parseObject(JSON.toJSONString(map),clazz));}}}catch (Exception e) {logger.error("[{}]查询列表数据异常,异常SQL>{};:{}",clazz,sql,e.toString());}return rtList;}/*** 根据SQL查询 List集合* @param sql 查询条件* @param tableName 表名* @return*/public List<Map<String,Object>> query(String sql,String tableName) {List<Map<String,Object>> rtList = new ArrayList<>();try {SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);//获取查询条件是否是*全查String selectParam = sql.substring(6, sql.indexOf("from")).trim();List<String> columnNames = sessionDataSetWrapper.getColumnNames();//判断如果第一个列值为Time时间戳去掉if(Objects.equals(columnNames.get(0),"Time")){columnNames.remove(0);}List<Map<String,Object>> itsList = packagingData(sessionDataSetWrapper,columnNames);for(Map<String,Object> map : itsList){//如果是*全查需要进行key值得转换if(Objects.equals("*",selectParam)){Map<String,Object> rtMap = new HashMap<>();//循环进行key值得转换for(Map.Entry<String,Object> it : map.entrySet()){rtMap.put(it.getKey().replace(tableName+".",""),it.getValue());}//map转换实体rtList.add(rtMap);}else{//如果不为*则依照别名来查//map转换实体rtList.add(map);}}} catch (Exception e) {logger.error(MSG_SQL,tableName,sql,e.toString());return rtList;}return rtList;}/*** 封装处理数据* @param sessionDataSet* @param titleList* @throws StatementExecutionException* @throws IoTDBConnectionException*/private List<Map<String,Object>> packagingData(SessionDataSet sessionDataSet, List<String> titleList)throws StatementExecutionException, IoTDBConnectionException {int fetchSize = sessionDataSet.getFetchSize();List<Map<String,Object>> rtList = new ArrayList<>();if (fetchSize > 0) {while (sessionDataSet.hasNext()) {Map<String,Object> rtMap = new HashMap<>();RowRecord next = sessionDataSet.next();List<Field> fields = next.getFields();String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp());rtMap.put("time",timeString);for (int i = 0; i < fields.size(); i++) {Field field = fields.get(i);// 这里的需要按照类型获取if(field.getDataType()==null||field.getObjectValue(field.getDataType())==null){rtMap.put(titleList.get(i), null);}else{rtMap.put(titleList.get(i), field.getObjectValue(field.getDataType()).toString());}}rtList.add(rtMap);}}return rtList;}
1、queryMapData 方法的话就是查询结果为Map集合的处理,比如聚合函数的查询等等。
2、queryLastData 方法为根据SQL查询表中最新的一条记录数,返回实体类。
3、queryLastData 方法为根据sql和表名查询一个Map集合
4、queryListData 根据sql查询一个list实体集合
5、query 根据sql查询一个List<Map>集合
下面为测试代码
System.out.println("1、queryMapData查询......");Map<String,Object> mapOne= iotDBSessionConfig.queryMapData("select count(id) as ct from root.syslog");System.out.println("结果:"+ArrayUtils.toString(mapOne));System.out.println("2、queryLastData 根据sql和实体类查询......");IoTDBSysLog ioTDBSysLog = (IoTDBSysLog) iotDBSessionConfig.queryLastData("select last * from root.syslog",IoTDBSysLog.class);System.out.println("结果:"+ioTDBSysLog.getLogIp()+"-->"+ioTDBSysLog.getCreateTime());System.out.println("3、queryLastData 根据sql和表名查询......");Map<String,Object> mapThree = iotDBSessionConfig.queryLastData("select last * from root.syslog", IoTDBTableParam.SYSLOG_IOT_TABLE);System.out.println("结果:"+ArrayUtils.toString(mapThree));System.out.println("4、queryListData 根据sql查询一个list实体集合......");List<IoTDBSysLog> list = (List<IoTDBSysLog>) iotDBSessionConfig.queryListData("select * from root.syslog",IoTDBSysLog.class);System.out.println("结果条数:"+list.size());for (IoTDBSysLog sysLog : list){System.out.println(sysLog.getLogIp()+"-->"+sysLog.getCreateTime());}System.out.println("5、query 根据sql查询一个List<Map>集合......");List<Map<String,Object>> listTwo = iotDBSessionConfig.query("select * from root.syslog", IoTDBTableParam.SYSLOG_IOT_TABLE);System.out.println("结果条数:"+list.size());for (Map<String,Object> map : listTwo){System.out.println(map.get("logIp")+"-->"+map.get("createTime"));}
结果如下

其中3,5两个方法是因为项目中需要进行添加的,是根据动态传递的参数来识别对应的表名,简单进行了包装处理,如果搭建有更好的方法可以留言交流。
相关文章:
IoTDB在springboot2中的(二) 查询
上一章我们处理的基本的构建接入,以及插入的处理,那么接下来我们进行查询的操作处理。 我们继续在IoTDBSessionConfig工具类中加入查询的方法处理 /*** description: 根据SQL查询最新一条数据* author:zgy* param sql sql查询语句,count查询…...
SpringBoot 底层机制分析【Tomcat 启动+Spring 容器初始化+Tomcat 如何关联Spring 容器】【下】
😀前言 本篇博文是关于SpringBoot 底层机制分析实现,希望能够帮助你更好的了解SpringBoot 😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大…...
NLP(六十五)LangChain中的重连(retry)机制
关于LangChain入门,读者可参考文章NLP(五十六)LangChain入门 。 本文将会介绍LangChain中的重连机制,并尝试给出定制化重连方案。 本文以LangChain中的对话功能(ChatOpenAI)为例。 LangChain中的重…...
C字符串与C++ string 类:用法万字详解(上)
目录 引言 一、C语言字符串 1.1 创建 C 字符串 1.2 字符串长度 1.3 字符串拼接 1.4 比较字符串 1.5 复制字符串 二、C字符串string类 2.1 解释 2.2 string构造函数 2.2.1 string() 默认构造函数 2.2.2 string(const char* s) 从 C 风格字符串构造 2.2.3 string(co…...
async/await函数需要trycatch吗?
前言 写异步函数的时候,promise 和 async 两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点,只总结为一句话:“async 是异步编程的终极解决方案”。 当使…...
Jenkins集成appium自动化测试(Windows篇)
一,引入问题 自动化测试脚本绝大部分用于回归测试,这就需要制定执行策略,如每天、代码更新后、项目上线前定时执行,才能达到最好的效果,这时就需要进行Jenkins集成。 不像web UI自动化测试可以使用无痕浏览器做到无界…...
MongoDB:切换log日志文件
可以不重启MongoDB,切换日志文件 use admin db.runCommand({logRotate:1})参考 MongoDB 日志切割三种方式...
代码随想录第三十五天
代码随想录第三十五天 Leetcode 860. 柠檬水找零Leetcode 406. 根据身高重建队列Leetcode 452. 用最少数量的箭引爆气球 Leetcode 860. 柠檬水找零 题目链接: 柠檬水找零 自己的思路:我的垃圾思路!!!!!!复…...
块、行内块水平垂直居中
1.定位实现水平垂直居中 <div class"outer"><div class"test inner1">定位实现水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…...
Mybatis引出的一系列问题-动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底…...
Docker学习之构建Base Image
构建Base Image 目标是构建一个类似官方Hello world的镜像,需要配置好Docker运行环境。 创建目录,编写代码 创建并进入docker目录。 mkdir docker cd dockertouch hello.cvim hello.chello.c文件的内容如下: #include <stdio.h>in…...
SFM(Structure from Motion)和NeRF(Neural Radiance Fields)
SFM(Structure from Motion)和NeRF(Neural Radiance Fields)都是计算机视觉领域中的重要算法,用于不同的任务和应用。 SFM(Structure from Motion): SFM是一种从图像序列中重建三维场…...
[Vue] Vue2和Vue3的生命周期函数
vue2有11个生命周期钩子, vue3有8个生命周期钩子 从vue创建、运行、到销毁总是伴随着各种事件, 创建、挂载、更新到销毁。 1.vue2系列生命周期 ⑴【beforecreate】实例创建前。 vue完全创建之前,会自动执行这个函数。 ⑵【Created】实例创建后。 这也是个生命…...
springboot集成分布式任务调度系统xxl-job(调度器和执行器)
一、部署xxl-job服务端 下载xxl-job源码 下载地址: https://gitee.com/xuxueli0323/xxl-job 二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库 三、启动项目、访问首页 访问地址: http://localhost:8080/xxl-job-admin/ 账号࿱…...
11_Vue3中的新的组件
1. Fragment 在Vue2中:组件必须要有一个跟标签在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中好处:减少标签层级,减少内存占用 2. Teleport 什么是Teleport?——Teleport 是一种能够将…...
详解推送Git分支时发生的 cannot lock ref 错误
在码云上建了一个项目仓库,分支模型使用 git-flow ,并在本地新建了一个功能分支 feature/feature-poll。后来在推送时发生错误,提示 cannot lock ref ...... 这样的错误信息。下面复盘一下具体过程和解决办法,以供参考。 在码云中建立仓库时,考虑到想按照 GitFlow 的模式…...
[国产MCU]-BL602开发实例-PWM
PWM 文章目录 PWM1、BL602的PWM介绍2、PWM驱动API介绍3、PWM使用示例脉冲宽度调制(Pulse width modulation,简称PWM)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳定电源输出的改变。这种方…...
【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发
目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明: Number of Simulated Users to Group 每次释放的线程数量。如果设置为0,等同…...
无法对watchdog.sys等系统文件删除,弯道修复,这里解决办法很简单
右击360强力删除...
ClickHouse(九):Clickhouse表引擎 - Log系列表引擎
进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
