2012-04-18 55 views
1

我想有一个HQL查询基本上做到这一点:多个集合函数

select quarter, sum(if(a>1, 1, 0)) as res1, sum(if(b>1, 1, 0)) as res2 from foo group by quarter; 

我希望有一个清单,我输出列表与Summary Class ->

Class Summary 
{ 
long res1; 
long res2; 
int quarter; 
} 

我怎样才能做到这一点在HQL中聚合?目标对象的hibernate映射是什么? 我不想使用SQL类型的查询,它将返回List<Object[]>,然后将其转换为List<Summary>

回答

2

由于Summary不是一个实体,所以您不需要映射它,您可以创建一个合适的构造函数并使用HQL构造函数表达式来代替。汇总功能和if也是可能的,但您需要使用case语法而不是if

所以,如果Foo是映射表Foo它是这样一个实体:

select new Summary(
    f.quarter, 
    sum(case when f.a > 1 then 1 else 0 end), 
    sum(case when f.b > 1 then 1 else 0 end) 
) from Foo f group by f.quarter 

参见:

+0

哇。这个看起来很有希望。谢谢。我会试试看。 – 2012-04-19 13:17:26

0

在映射中使用子查询可能是可能的。在hibernate文档中查看More complex association mappings。我从来没有尝试过这种可能性。

即使冬眠家伙推荐“......但它是更实际的处理这些使用HQL或条件查询的情况下”这就是我会做的:在HQL语句中使用group-by并与列表一起工作。将该列表复制到合适对象列表中的额外时间与group-by在数据库中使用的时间相比可以忽略不计。但似乎你不喜欢这种可能性。

第三种可能性是在包含group-by的数据库中定义一个视图,然后为该视图创建一个法线映射。