You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails GORM CriteriaBuilder的count()方法返回值异常问题

GORM CriteriaBuilder count() 与 Projection 分组的行为问题

我之前也碰到过这个坑,其实这是count()方法在CriteriaBuilder里的设计逻辑导致的,和文档描述的歧义有关。

问题原因

count()方法的核心定位是返回单个数值——即符合查询条件的记录总条数,它并不会处理你在projections里定义的分组逻辑。当你在count()的闭包里添加分组投影时,这个分组配置会被忽略,方法只会返回整个表(或匹配基础条件)的总记录数,也就是你看到的100。

而list()方法则是专门用来获取查询结果集合的,它会完整执行你定义的所有projection配置,包括分组和计数,所以能正确返回8行分组后的计数结果。

正确的实现方式

如果你需要获取分组后的计数结果,就用你已经测试有效的list()方法:

def c = gtest01.TestA.createCriteria() 
c.list { 
    projections { 
        groupProperty 'grouping' 
        count() 
    } 
}.each { t -> 
    println "t $t" 
}

如果只是想获取总记录数,直接用gtest01.TestA.count()就好,没必要走CriteriaBuilder的count()方法。

补充说明

GORM的文档在这里确实容易让人误解,看起来count()应该配合projection返回对应的计数,但实际上它的设计就是返回总条数。如果需要复杂的统计(比如分组计数),list()是正确的选择,它返回的列表里每个元素都是[分组值, 该组记录数]的结构,完全能满足需求。

内容的提问来源于stack exchange,提问作者MonetsChemist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:38