如何修复指定Criteria的GORM查询的list方法返回的列表的totalCount?

时间:2015-03-28 21:11:18

标签: grails gorm

我从GORM查询的list函数返回的列表的totalCount属性得到了错误的结果。

我认为这是由于它还包括重复结果的问题。列表中返回的结果是正确的,但计数似乎是错误的。

我该如何解决?

我试过以下但不起作用:

trace.setResultTransformer(CriteriaSpecification.PROJECTION)

以下是我的GORM查询:

    def trace = Trace.createCriteria()

    def results = trace.list(max:max, offset:offset) {
        createAlias('module','mod', CriteriaSpecification.LEFT_JOIN)
        createAlias('symbol','sym', CriteriaSpecification.LEFT_JOIN)
        createAlias('fault', 'fault',CriteriaSpecification.LEFT_JOIN)
        createAlias('fault.report', 'report', CriteriaSpecification.LEFT_JOIN)
        createAlias('fault.tgmap', 'tg', CriteriaSpecification.LEFT_JOIN)
        createAlias('tg.traceGroup16','tr', CriteriaSpecification.LEFT_JOIN)        
        projections
        {
            property('fault.id')
            property('tr.geckId')
            property('report.email')
            property('fault.ver')
            property('fault.shortOs')
            property('fault.faultDate')
            property('frameNumber')
            property('mod.module')
            property('sym.symbol')
            groupProperty 'fault.pid'
            groupProperty 'report.file'
        }
        // Handle Unknown module case
        if (module.length() > 0 && symbol.length() > 0 && module != symbol)
        {
            and
            {
                like('mod.module', '%' + module + '%')
                like('sym.symbol', '%' + symbol + '%')
            }

        }
        else if (module.length() > 0 && symbol.length() > 0 && module == symbol)
        {
            or 
            {
                like('mod.module', '%' + module + '%')
                like('sym.symbol', '%' + symbol + '%')
            }
        }
        else if (module.length() > 0)
        {
            like('mod.module', '%' + module + '%')
        }
        else if (symbol.length() > 0)
        {
            like('sym.symbol', '%' + symbol + '%')
        }           
        order("fault.faultDate", "desc")
}

1 个答案:

答案 0 :(得分:0)

这是一个非常恼人的问题 - 您可以使用distinct投影过滤掉重复项,但是您会发现分页是混乱的。通常我最终得到这样的方法:

  1. 使用countDistinct
  2. 查询获取totalCount
  3. 再次查询以使用distinct('id')投影
  4. 获取一系列行(例如,行1 - 10)的 distinct ids
  5. 创建PagedResultList个实例,然后使用DomainClass.getAll(ids)
  6. 再次查询
  7. totalCount
  8. 上手动设置DomainClass.getAll(ids)PagedResultList返回的列表

    您可以在优秀的Filter PaneQuick Search插件中看到使用此方法的一些示例。

    不理想,但它确实有效,对于大多数用例而言,执行4次查询(而不是2次)的性能影响并不是那么糟糕。