Grails 3.3 GORM带投影Where Query中count()与list().size()结果不一致
Gorm DetachedCriteria count() Returns Wrong Value When Using Group Projections
我之前也踩过这个Gorm的坑!咱们来拆解一下这个问题的原因和解决办法:
问题根源
当你在DetachedCriteria里使用projections做分组统计(比如groupProperty('finishPosition')搭配rowCount())时,count()方法的行为和你预期的完全不一样。
Gorm的count()默认是用来统计原始实体的总记录数,当你加了分组投影后,它并没有智能切换成统计「分组后的结果集条数」,而是直接把投影里的rowCount()聚合结果(也就是第一个分组的统计值576)当成了返回值。这就是为什么dc.count()和dc.list().size()结果差这么多的核心原因——一个取的是某组内的记录数,一个取的是分组的总数量。
解决方案
你现在用query.list().size()替代是完全没问题的,不过如果分组结果特别多,担心拉取整个列表的性能,也可以手动构造一个专门统计分组数量的查询:
def groupCount = Runner.where { projections { countDistinct('finishPosition') // 直接统计分组字段的唯一值数量,和分组结果数一致 } }.get()
这样就能直接拿到你想要的22,不需要先拉取所有分组数据再计算size。
总结
- 带分组投影的
DetachedCriteria调用count()时,返回的是聚合函数的结果(比如某组的记录数),而非分组结果的总数量 - 可靠的替代方式要么用
list().size(),要么用countDistinct()针对分组字段做统计
内容的提问来源于stack exchange,提问作者MonetsChemist
相关产品推荐
相关产品推荐

