我想要一个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>
答案 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的数据库中定义一个视图,然后为该视图创建一个法线贴图。