我有以下代码
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?
答案 0 :(得分:0)
在编辑问题后与实际问题无关,但此引用似乎很有用
通常,PagedResultList
.size()
对resultList属性执行size()(内存中对象表示数据库记录),而.getTotalCount()
对数据库进行计数查询。如果这两个值不匹配,您的列表可能包含重复。
答案 1 :(得分:0)
在查看相关问题(GORM createCriteria and list do not return the same results : what can I do?)后,我确定有几种方法:
使用grails投影groupBy('id') - 不起作用b / c我需要整个对象
使用HSQL - Domain.executeQuery - 实际上这对我的场景不起作用,因为这会返回一个列表,而criteria.list返回一个PagedResultList,我之前得到了totalCount。这个解决方案让我学习了HSQL,并让我将现有逻辑分解为两个组件 - 一个返回PagedResultList,一个没有
我最终选择了选项3,因为它很快,不需要我学习一门新语言(HSQL),我觉得我可以轻松编写代码来完成它并且我不受CPU的限制做这种独特的身份证检查。