【问题标题】:PagedResultList .size() and .getTotalCount() return different values in grails gormPagedResultList .size() 和 .getTotalCount() 在 grails gorm 中返回不同的值
【发布时间】:2018-02-20 09:09:46
【问题描述】:

我有以下代码

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 如果使用子查询或关联,则可能会结束 在结果集中多次使用同一行。在休眠一 会做一个“CriteriaSpecification.DISTINCT_ROOT_ENTITY”。在 Grails 一 只用这个方法就可以做到。

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

listDistinct() 方法不适用于分页 选项 maxResult 和 firstResult。如果您需要不同的结果 分页,我们目前推荐你使用HQL。你可以了解 来自这篇博文的更多信息。

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

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

【问题讨论】:

  • 能否打印 res 的全部内容?
  • @WallSkyBlue 完成,编辑了我的原始帖子
  • 嗯...我猜你的号码不匹配,因为重复,但这比我想象的更糟糕,哈哈,抱歉不知道这个

标签: grails grails-orm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    2. 使用 HSQL - Domain.executeQuery - 实际上这对我的场景并不适用,因为它返回一个列表,而条件列表返回一个 PagedResultList,我之前从中获得了 totalCount。这个解决方案让我学习了 HSQL,也让我将现有的逻辑分解为两个组件 - 一个返回 PagedResultList,另一个没有

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 2011-10-09
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多