PagedResultList .size() 和 .getTotalCount() return grails gorm 中的不同值

PagedResultList .size() and .getTotalCount() return different values in grails gorm

我有以下代码

PagedResultList res = myService.getPage(paginateParams, ...)
println res.size() // returns 2
println res.getTotalCount() // returns 1

getPage 看起来像:

def criteria = MyDomain.createCriteria()
criteria.list(max: paginateParams.max, offset: paginateParams.offset) { // max is 10, offset is 0, sortBy is updatedAt and sortOrder is desc
    eq('org', org)
    order(paginateParams.sortBy, paginateParams.sortOrder)
}

为什么这两个方法 return 有不同的值?该文档没有解释差异,但确实提到 getTotalCount 是记录数

目前在 grails 2.4.5

编辑:

println on res 打印输出:

res: [
com.<hidden>.MyDomain: 41679f98-a7c5-4193-bba8-601725007c1a, 
com.<hidden>.MyDomain: 41679f98-a7c5-4193-bba8-601725007c1a]

是的,res 有两次 SINGLE 对象 - 这就是我要修复的错误。我怎么知道的?我在 MyDomain 的 ID 上有一个主键,当我检查数据库时,它也显示了这个特定组织的一条记录(见我的标准)

编辑 2:我找到了这条评论 (http://docs.grails.org/2.4.5/ref/Domain%20Classes/createCriteria.html)

listDistinct If subqueries or associations are used, one may end up with the same row multiple times in the result set. In Hibernate one would do a "CriteriaSpecification.DISTINCT_ROOT_ENTITY". In Grails one can do it by just using this method.

如果我理解正确的话,他们的说法是 "list" 方法在这种情况下不起作用,请改用 listDistinct,但随后他们会继续警告:

The listDistinct() method does not work well with the pagination options maxResult and firstResult. If you need distinct results with pagination, we currently recommend that you use HQL. You can find out more information from this blog post.

但是,博客 post 已经死了 link。

相关:GORM createCriteria and list do not return the same results : what can I do?

问题编辑后与实际问题无关,但此引用似乎有用

Generally PagedResultList .size() perform size() on resultList property (in-memory object represent database record), while .getTotalCount() do count query against database. If this two value didn't match your list may contain duplicate.

查看相关问题(GORM createCriteria and list do not return the same results : what can I do?)后确定有以下几种做法:

  1. 使用 grails 投影 groupBy('id') - 不起作用 b/c 我需要整个对象

  2. USe HSQL - Domain.executeQuery - 实际上这对我的场景不太适用,因为这个 returns 是一个列表,而 criteria.list returns 一个 PagedResultList,我之前从中获得了 totalCount。这个解决方案让我学习了 HSQL,也让我把我现有的逻辑分解成两个组件——一个返回 PagedResultList,一个不返回

  3. 在我处理 PagedResultList 时只需保留一组 ID,并确保我没有任何重复项。

我最终选择了选项 3,因为它很快,不需要我学习一门新语言 (HSQL),而且我觉得我可以很容易地编写代码来做到这一点,而且我不受限制CPU 做这样的唯一 ID 检查。