我从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")
}
答案 0 :(得分:0)
这是一个非常恼人的问题 - 您可以使用distinct
投影过滤掉重复项,但是您会发现分页是混乱的。通常我最终得到这样的方法:
countDistinct
distinct('id')
投影PagedResultList
个实例,然后使用DomainClass.getAll(ids)
totalCount
DomainClass.getAll(ids)
和PagedResultList
返回的列表
醇>
您可以在优秀的Filter Pane和Quick Search插件中看到使用此方法的一些示例。
不理想,但它确实有效,对于大多数用例而言,执行4次查询(而不是2次)的性能影响并不是那么糟糕。