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 中实现这种聚合?目标对象的休眠映射是什么?我不想使用会返回List<Object[]>然后将其转换为的 SQL 类型的查询List<Summary>

4

2 回答 2

4

由于Summary不是实体,因此您不需要为其映射,您可以创建适当的构造函数并改用 HQL 构造函数表达式。聚合函数和ifs 也是可能的,但您需要使用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

也可以看看:

于 2012-04-18T10:39:16.957 回答
0

映射中的子选择可能是可能的。查看hibernate 文档中的更复杂的关联映射。我从未尝试过这种可能性。

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

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

于 2012-04-18T10:17:01.160 回答