谁说秃头不是一种浪漫 2023-10-21 17:58 采纳率: 50%
浏览 5

后端自定义动态sql与json处理问题

springboot3 +mybatisplus 多表查询与json处理的复杂查询sql问题:

img


我通过第一次查询的结果拼接sql,由于第一次查询里面的数据量不确定,所以sql长度不确定,我要根据这个sql去查询另一张表内json里面的数据,所以返回对象的字段也不确定。后端我应该如何去实现现在我不知道怎么去运行这个sql。最终测试sql:

select JSON_value(s.jsonstr,'$.tc') AS [温度.c],JSON_value(s.jsonstr,'$.high') AS [高度.cm] from shuju_read s,zhibiao z where s.shebei_id=z.shebei_id

数据库数据:

img


我在sqlserver数据库中管理系统的测试结果:

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-21 20:23
    关注

    【以下回答由 GPT 生成】

    问题描述已经很清晰了,我会尽力给出具体的解决方案。

    根据您的描述,您希望在Spring Boot和MyBatis Plus中实现动态SQL与JSON处理。您需要根据一次查询的结果拼接SQL,并查询另一张表中的JSON字段数据。由于查询结果的数据量和返回字段都不确定,您需要动态生成SQL语句并解析JSON字段数据。

    针对这个问题,我将给出以下解决方案:

    1. 在pom.xml文件中添加Spring Boot和MyBatis Plus的依赖:
    <dependencies>
        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- MyBatis Plus -->
        <dependency>
            <groupId>com.baomidou.mybatisplus</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>最新版本号</version>
        </dependency>
    
        <!-- 其他依赖... -->
    </dependencies>
    
    1. 创建实体类和Mapper接口:
    // 实体类
    @Data
    public class ShujuRead {
        private String jsonstr;
        // 其他属性...
    }
    
    // Mapper接口
    @Mapper
    public interface ShujuReadMapper extends BaseMapper<ShujuRead> {
        // 其他方法...
    }
    
    1. 编写动态SQL的方法:
    @Service
    public class ShujuReadService {
        @Autowired
        private ShujuReadMapper shujuReadMapper;
    
        public List<Map<String, Object>> dynamicQuery() {
            List<Map<String, Object>> result = new ArrayList<>();
    
            // 执行第一次查询获取结果
            List<ShujuRead> shujuReadList = shujuReadMapper.selectList(null);
    
            // 动态拼接SQL
            for (ShujuRead shujuRead : shujuReadList) {
                String jsonstr = shujuRead.getJsonstr();
    
                // 解析JSON字段数据,假设为{"tc": 25, "high": 180}
                int temperature = JSON.parseObject(jsonstr).getIntValue("tc");
                int height = JSON.parseObject(jsonstr).getIntValue("high");
    
                // 拼接动态SQL
                String dynamicSql = "select * from zhibiao where temperature = " + temperature + " and height = " + height;
    
                // 执行动态SQL
                List<Map<String, Object>> dynamicResult = shujuReadMapper.selectMaps(new QueryWrapper<Map<String, Object>>().apply(dynamicSql));
    
                // 将动态查询结果添加到最终结果集
                result.addAll(dynamicResult);
            }
    
            return result;
        }
    }
    

    这样,您就实现了根据第一次查询的结果拼接动态SQL,并查询另一张表中的JSON字段数据的功能。

    请注意,以上代码只是一个简单的示例,您需要根据实际情况进行调整和优化。在处理动态SQL时,要特别注意SQL注入的风险,可以使用MyBatis Plus提供的参数绑定或预编译的方式来避免。

    希望以上解决方案能够满足您的需求。如果您对具体实现还有任何疑问或需要进一步的帮助,请随时告诉我。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳