PagedResultList .size()和.getTotalCount()在grails gorm中返回不同的值

时间:2017-09-12 03:13:55

标签: 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)
}

为什么这两个方法返回不同的值?文档没有解释差异,但确实提到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如果使用子查询或关联,可能会结束   在结果集中多次使用相同的行。在Hibernate中   会做一个“CriteriaSpecification.DISTINCT_ROOT_ENTITY”。在Grails one   可以通过使用这种方法来实现。

如果我理解正确,他们说“list”方法在这种情况下不起作用的方式,请使用listDistinct,然后他们继续警告:

  

listDistinct()方法不适用于分页   选项maxResult和firstResult。如果你需要不同的结果   分页,我们目前建议您使用HQL。你可以找到   来自此博客文章的更多信息。

然而,博客文章是一个死链接。

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

2 个答案:

答案 0 :(得分:0)

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

  

通常,PagedResultList .size()对resultList属性执行size()(内存中对象表示数据库记录),而.getTotalCount()对数据库进行计数查询。如果这两个值不匹配,您的列表可能包含重复。

答案 1 :(得分:0)

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

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

  2. 使用HSQL - Domain.executeQuery - 实际上这对我的场景不起作用,因为这会返回一个列表,而criteria.list返回一个PagedResultList,我之前得到了totalCount。这个解决方案让我学习了HSQL,并让我将现有逻辑分解为两个组件 - 一个返回PagedResultList,一个没有

  3. 在处理我的PagedResultList时,只需保留一组ID,并确保我没有任何重复项。
  4. 我最终选择了选项3,因为它很快,不需要我学习一门新语言(HSQL),我觉得我可以轻松编写代码来完成它并且我不受CPU的限制做这种独特的身份证检查。