IoTDB在springboot2中的(二) 查询

news2024/9/24 9:27:42

上一章我们处理的基本的构建接入,以及插入的处理,那么接下来我们进行查询的操作处理。

我们继续在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两个方法是因为项目中需要进行添加的,是根据动态传递的参数来识别对应的表名,简单进行了包装处理,如果搭建有更好的方法可以留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM 类加载和垃圾回收

JVM 1. 类加载1.1 类加载过程1.2 双亲委派模型 2. 垃圾回收机制2.1 死亡对象的判断算法2.2 垃圾回收算法 1. 类加载 1.1 类加载过程 对应一个类来说, 它的生命周期是这样的: 其中前 5 步是固定的顺序并且也是类加载的过程&#xff0c;其中中间的 3 步我们都属于连接&#xf…

【Java-16】动态代理的使用方法及原理实现

代理模式&#xff1a;静态代理 目标 了解静态代理模式实现 路径 静态代理概述静态代理案例 静态代理概述 静态代理&#xff1a; 是由程序员创建或工具生成代理类的源码&#xff0c;再编译成为字节码 &#xff08;字节码文件在没有运行java之前就存在了&#xff09; 在编译…

Linux——常用命令(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 前期回顾 【新星计划Linux】——常用命令&#xff08;1&#xff09; 目录 一.其它常用命…

vue或uniapp使用pdf.js预览

一、先下载稳定版的pdf.js&#xff0c;可以去官网下载 官网下载地址 或 pdf.js包下载(已配置好&#xff0c;无需修改) 二、下载好的pdf.js文件放在public下静态文件里&#xff0c; uniapp是放在 static下静态文件里 三、使用方式 1. vue项目 注意路径 :src"static/pd…

在矩池云使用ChatGLM-6B ChatGLM2-6B

ChatGLM-6B 和 ChatGLM2-6B都是基于 General Language Model (GLM) 架构的对话语言模型&#xff0c;是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同发布的语言模型。模型有 62 亿参数&#xff0c;一经发布便受到了开源社区的欢迎&#xff0c;在中文语义理解和对话生成上有…

语音信号的A律压缩和u律压缩matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 A律压缩算法 4.2 μ律压缩算法 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(…

DanceFight VoxEdit 大赛

准备好让自己的创造力更上一层楼了吗&#xff1f;别再犹豫了&#xff0c;The Sandbox 将为你们带来一场激动人心的挑战&#xff0c;让你们的 VoxEdit 技能和舞蹈动作激情四射&#xff01;准备好参加终极数字盛会——DanceFight VoxEdit 大赛&#xff01;&#x1f57a;&#x1…

物理层扩展以太网

扩展站点与集线器之间的距离&#xff1a;   在10BASE-T星型以太网中&#xff0c;可使用光纤和一对光纤调制解调器来扩展站点与集线器之间的距离。   为站点和集线器各增加一个用于电信号和光信息号转换的光纤调制解调器&#xff0c;以及他们之间的通信光纤。 扩展共享式以太…

ICS PA0

目录 环境配置工具的使用及相关资源Compling and Running NEMU配置系统make menuconfig项目构建make运行与调试 Submit 环境配置 Ubuntu安装中的分区不太明白安装了中文输入法和必要的工具链虚拟机与主机互联 工具的使用及相关资源 vim&#xff08;vimtutor是vim的一个内置教…

Nginx跳转模块——location与rewrite

一、location 1、location作用 用于匹配uri&#xff08;文件、图片、视频&#xff09; uri&#xff1a;统一资源标识符。是一种字符串标识&#xff0c;用于标识抽象的或物理资源文件、图片、视频 2、locatin分类 1、精准匹配&#xff1a;location / {...} 2、一般匹配&a…

【80天学习完《深入理解计算机系统》】第三天 2.3 整数运算【正负溢出】【运算的溢出】【类型转换的二进制扩展】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754)

ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754) 二、Variant 1 (CVE-2017-5753) 三、Variant 2 (CVE-2017-5715) 四、Variant 3 (CVE-2017-5754) 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, C…

向量数据库介绍

1.什么是向量数据 向量数据库是一种专门用于存储和检索向量数据的数据库。它不同于传统的关系型数据库&#xff0c;而是基于向量相似度匹配的方式来实现高效的数据查询和分析。 向量数据库的应用场景非常广泛&#xff0c;包括但不限于以下几个方面&#xff1a; 图片、音频和视频…

微服务02-docker

1、Docker架构 1.1 镜像和容器 Docker中有几个重要的概念&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起&#xff0c;称为镜像。Docker镜像是用于创建 Docker 容器的模板 。就像面向对象编…

js代码执行顺序(同步与异步)

1.同步与异步 异步任务又分为宏任务和微任务 2.执行规则 同步代码遇到,直接执行Promise中.then前的代码直接执行,.then后的代码丢入微任务队列中遇到定时器直接将里面的代码丢入宏任务队列中同步代码执行完&#xff0c;去看微任务,有则执行&#xff1b;再去看宏任务&#xf…

文件的权限

1、修改文件的所属者和所属组 2、修改文件某一类人&#xff08;所属者、所属组、其他人&#xff09;的权限 一、用户对于普通文件的权限 二、用户对于目录文件的权限 三、访问控制列表ACL 四、特殊权限&#xff08;了解&#xff09; wuneng创建了几个文件&#xff0c;xiaoming对…

【C语言】预处理详解

本文目录 1 预定义符号 2 #define 2.1 #define 定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 2.7 命名约定 3 #undef 4 命令行定义 5 条件编译 6 文件包含 6.1 头文件被包含的方式 6.2 嵌套文件包含 1 预定义符号 __…

2023亚马逊秋季大促定档!卖家要做好准备!

亚马逊Prime秋季促销&#xff0c;又称亚马逊Prime会员早享日&#xff08;Prime Early AccessSale&#xff09;&#xff0c;是亚马逊在2022年才正式推出的一个面向Prime会员的促销活动&#xff0c;与每年7月举办的Prime Day大促是同等级活动&#xff0c;去年秋季大促也是在10月举…

C - The Battle of Chibi

题意&#xff1a;就是问你数组中长度为m的上升子序列(没说连续&#xff09;有多少个。 1&#xff1a;可以想到状态表示dp[ i ][ j ] 代表以 a[i] 为结尾的且长度为 j 的严格单增子序列的数目&#xff0c; 那么状态计算就为 , 那我们如果不优化直接写&#xff0c;一层n&am…

数据结构刷题训练——链表篇(一)

目录 前言 题目一&#xff1a;链表的中间节点 思路 分析 题解 题目二&#xff1a;链表中倒数第k个结点 思路 分析 题解 题目三&#xff1a;合并两个有序链表 思路 分析 题解 方法二 题解 题目四&#xff1a;链表的回文结构 思路 分析 题解 总结 前言 今天我将开…