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
相关产品推荐
相关产品推荐

