Java通过Map实现与SQL中的group by相同的逻辑

在mysql8.0之后使用group by必须带上聚合函数,这在mysql-plus中无法直接实现,必须写sql语句才可以。下面通过Java的Map集合来实现类似的操作

1.在mybatis-plus中使用了gorup的原代码,思路是先查询了group by的对应字段,然后通过循环再进一步根据这个字段查询相关数据,整体步骤很繁琐,不比写一个mapper快多少。

复制代码
		LambdaQueryWrapper<JkgDataJson> jsonQueryWrapper1 = new LambdaQueryWrapper<>();
        jsonQueryWrapper1.eq(JkgDataJson::getJkgDataId, jkgData.getId());
        jsonQueryWrapper1.select(JkgDataJson::getLayerNumber);
        jsonQueryWrapper1.groupBy(JkgDataJson::getLayerNumber);
        List<JkgDataJson> jkgDataJsonList = jkgDataJsonMapper.selectList(jsonQueryWrapper1);

        for (int i = 0; i < jkgDataJsonList.size(); i++) {
            int layerNumber = jkgDataJsonList.get(i).getLayerNumber();
            LambdaQueryWrapper<JkgDataJson> jsonQueryWrapper2 = new LambdaQueryWrapper<>();
            jsonQueryWrapper2.eq(JkgDataJson::getJkgDataId, jkgData.getId());
            jsonQueryWrapper2.eq(JkgDataJson::getLayerNumber, layerNumber);
            List<JkgDataJson> jkgDataJsonList1 = jkgDataJsonMapper.selectList(jsonQueryWrapper2);
        }

2.通过Map实现分组

复制代码
 		//一次性查询当前所需的全部数据,通过分组字段放入map映射,后续的循环中就不需要每次去查询数据库了
        LambdaQueryWrapper<JkgDataJson> jsonWrapper = new LambdaQueryWrapper<>();
        jsonWrapper.eq(JkgDataJson::getJkgDataId, jkgData.getId());
        List<JkgDataJson> allDataJsonList = jkgDataJsonMapper.selectList(jsonWrapper);
        Map<Integer, List<JkgDataJson>> layerNumberMap = new HashMap<>();
        for (JkgDataJson dataJson : allDataJsonList) {
        	//这里放入map键的就是你需要分组的字段
            int layerNumber = dataJson.getLayerNumber();
            //在 Map 中查找指定key的值value,当layerNumber键不存在时,创建一个新的ArrayList插入到Map中
            layerNumberMap.computeIfAbsent(layerNumber, k -> new ArrayList<>()).add(dataJson);
        }

        for (Map.Entry<Integer, List<JkgDataJson>> entry : layerNumberMap.entrySet()) {
            int layerNumber = entry.getKey();
            List<JkgDataJson> jsonList = entry.getValue();
        }
相关推荐
我叫黑大帅1 小时前
如何排查 MySQL 慢查询
后端·sql·面试
techdashen1 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
一 乐1 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
星空椰1 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript
恼书:-(空寄1 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-19431 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
忒可君1 小时前
C# winform 自制分页功能
android·开发语言·c#
Rust研习社1 小时前
Rust 智能指针 Cell 与 RefCell 的内部可变性
开发语言·后端·rust
leaves falling2 小时前
C++模板进阶
开发语言·c++
坐吃山猪2 小时前
Python27_协程游戏理解
开发语言·python·游戏