Hibernate GORM中子查询的平均值

Hibernate GORM中子查询的平均值,hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个带有列a&C的表T,我想从中检索一个平均计数,如下所示: 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.createCriteri

我有一个带有列a&C的表T,我想从中检索一个平均计数,如下所示:

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')
    }
}

更新
最近,人们发现内存中的数据库限制在
count()
上使用
avg()
。经过多次盘问,人们发现使用Oracle db时,下面的HQL实际上可以产生适当的结果,并消除了从db中提取行然后在Groovy中计算平均值的复杂性:

T.executeQuery("select avg(count(t)) from Team as t where t.c = 1 group by t.a")
我在内存中遇到的问题是db


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

您可以结合使用
with criteria
和groovy
collect
来获得as的平均计数:

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

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

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

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

我在更新部分添加了一个示例。具有A和C属性的单个实体T有一种从别名条件中进行项目的方法吗?在SQL中,从另一个select语句中进行选择非常简单。我很惊讶,这甚至不能在SQL中完成HQL@Alex我在答案的前几行提到了你们的困境。HQL和标准,别名处理域类属性。投影只能应用于域类的属性。你不能像这样投影。顺便说一句,使用groovy方法获得平均值有什么问题,这是结果集上的简单算法?如果你仍然觉得GORM或HQL不称职,那么你可以很好地跳到SQL。从
Sess抓取Hibernate会话ionFactory
createSQLQuery
,然后执行。谢谢。我接受了你的回答。问题是,如果计数查询中有很多记录,那么很多数据必须从数据库中传输。在数据库中进行平均更有效。@Alex我非常同意。但我没有办法在当对内存中的数据库进行测试时,rom查询。很高兴HQL为oracle数据库工作。更重要的是,查询得到了优化。现在我的问题是“为什么在行为上存在这种差异?”。是方言的作用决定了哪些函数可以使用,哪些函数不能使用吗?如果你给出一个实际的例子,而不是这个C垃圾,我可以100%告诉你。我完全尝试了这种方法,但失败了。
t.AC
,我遗漏了什么吗?你做到了!不需要其他例子。@dmahapatro I belive它应该是
t
,而不是
t.AC
@Alex它对我从来都不起作用。请参考我在grails控制台中使用的。在第一次运行时取消对创建部分的注释,然后在后续运行时对其进行注释。请注意我的断言。
Team
表示
t
,其中
a
c
是整数。@Alex您也可以选择吗w您的最终实施情况如何?