QueryDSL GroupBy.list()处理未排序数据时分组结果不符合预期
QueryDSL GroupBy.list() 内存分组异常:未排序数据无法合并相同Key分组
问题本质
QueryDSL的GroupBy.list()处理内存集合时,默认是流式连续分组——只会合并遍历过程中连续出现的相同Key,而非全局合并所有匹配的Key。这就是未排序数据里相同Key不连续时,会被拆成多个独立分组的原因。
解决办法
1. 先排序再分组
先把集合按分组Key排序,让相同Key连续出现,再传入transform:
// 你的未排序Pair集合 List<Pair<String, Integer>> unsortedPairs = Arrays.asList( new Pair<>("A", 1), new Pair<>("B", 2), new Pair<>("A", 3), new Pair<>("C", 4), new Pair<>("B", 5) ); // 按Key排序 List<Pair<String, Integer>> sortedPairs = unsortedPairs.stream() .sorted(Comparator.comparing(Pair::getKey)) .collect(Collectors.toList()); // 执行分组 Map<String, List<Integer>> groupedResult = GroupBy.transform( groupBy(Pair::getKey).list(Pair::getValue), sortedPairs );
处理后相同Key会被合并为一个分组。
2. 替换为JDK原生分组
如果不需要QueryDSL分组的特殊特性,直接用JDK的Collectors.groupingBy()更适配全局合并场景:
Map<String, List<Integer>> groupedResult = unsortedPairs.stream() .collect(Collectors.groupingBy( Pair::getKey, Collectors.mapping(Pair::getValue, Collectors.toList()) ));
补充说明
QueryDSL的GroupBy模块最初为数据库查询分组设计,数据库返回的分组结果天然有序,因此内存分组逻辑沿用了"连续合并"的实现,没有做全局哈希映射的分组处理。这是它和JDK原生分组的核心差异,使用时需注意场景匹配。
内容的提问来源于stack exchange,提问作者YooSeok Lee
相关产品推荐
相关产品推荐

