在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();
}