Hibernate Query中的多个聚合函数

时间:2012-04-18 08:52:43

标签: sql hibernate hql aggregate

我想要一个HQL查询基本上这样做:

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

我想要一个List作为我的输出列表Summary Class ->

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

如何在HQL中实现此聚合?目标Object的hibernate映射是什么? 我不想使用会返回List<Object[]>的SQL类查询,然后将其转换为List<Summary>

2 个答案:

答案 0 :(得分:3)

由于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

另见:

答案 1 :(得分:0)

映射中的子选择可能是可能的。在hibernate文档中查看More complex association mappings。我从未尝试过这种可能性。

但是即使是hibernate的人也推荐“ ...但是使用HQL或条件查询处理这些案例更为实际。”这就是我要做的事情:使用group-by在HQL语句中并使用List。与分组在数据库中使用的时间相比,将此列表复制到合适对象列表中的额外时间可以忽略不计。但似乎你不喜欢这种可能性。

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