GORM中子查询的平均值

时间:2013-07-16 02:01:49

标签: hibernate grails gorm

我有一张带有A列和A列的表T. C,我想从中检索平均数如下:

select avg(AC) as AV
from
( 
 select A, count(1) as AC
 from T
 where C = 1
 group by A
)

如何在GORM中完成此操作? GRAILS 2.2.0版本我尝试按照文档进行操作,但没有很好的例子。我甚至无法使子查询起作用:(

更新

我能够让计数部分起作用。现在仍然确定如何获得平均值,因为我不知道如何从查询中进行选择。

def tc = T.createCriteria()

def tCounts = tc.buildCriteria {
    and {
        eq 'C', 1
    }
    projections {
       groupProperty 'A'
       rowCount('AC')
    }
}

2 个答案:

答案 0 :(得分:1)

<强>更新
最近发现,内存数据库限制在avg()上使用count()。经过多次交叉检查,发现使用Oracle db实际上下面的HQL可以产生适当的结果,并且可以消除从db获取行然后计算Groovy中的平均值的复杂性:

T.executeQuery("select avg(count(t)) from Team as t where t.c = 1 group by t.a")

我在内存数据库中遇到的问题是showcased as a sample


<强> INIT
在我第一次查看查询时,我认为可以使用DetachedCriteria来实现,但avg投影只能应用于域属性,但不能应用于count()。 HQL也是如此。

您可以使用withCriteria和groovy collect的组合来获得A的平均值:

def countOfA = T.withCriteria{
    eq 'c', 1
    projections{
        count 'a'
        groupProperty 'a'
    }
}?.collect{it?.first()}

def averageCount = countOfA ? (countOfA.sum() / countOfA.size()) : 0

答案 1 :(得分:0)

这是在HQL中完成的。在我的一个域名的grails控制台中测试:

T.executeQuery("""
select avg(count(*))
from T t
where t.c = 1
group by t.a
""")