HQL按集合项的属性值的总和进行排序

时间:2012-09-06 09:40:49

标签: hibernate sum hql named

我希望有人可以通过Hibernate命名查询指出我正确的方向。

我想根据集合项的属性对结果进行排序。认为这是最简单的例子:

我有两个班级:A和B

A有一个属性“Bs”,它是一组B。

B有一个属性“rank”,它是一个整数。

我想查询(全部)As并按照A.Bs中B.rank的总和对它们进行排序。

类似的东西:

select x from A as x order by sum(x.Bs.rank)

希望这是有道理的!上面的查询现在抛出一个错误“非法尝试取消引用收集”。

2 个答案:

答案 0 :(得分:1)

您必须手动将对表b的访问权限添加到select中,就像在SQL中一样。在SQL中你可以

select a.key, a.col2, a.col3, ... from a, b
   where a.key = b.foreignKeyFromA
   group by a.key, a.col2, a.col3, ...
   order by sum(b.rank);

Hibernate不会自动生成对B的这种访问,因此您必须在HQL语句中手动实现它,如下所示

select new A(a.key, a.col2, a.col3, ...) from A a join B b
   group by a.key, a.col2, a.col3, ...
   order by sum(b.rank)

(您需要A的拟合构造函数,或者您可以使用单个值获取对象数组。必须在映射中定义A和B之间的关系;可能已经是这种情况。)

备注:在group by子句中,您必须提及您选择的所有列,即使它们不再更改分组(键已经是唯一的)。如果您未提及所有选定列,则会在Oracle数据库上出现错误。 MySQL不需要这个,group by a.key就足够了,但你应该编写主要在所有数据库上工作的HQL语句。

答案 1 :(得分:1)

如果A是复杂的或继承的,您可能只想得到它的ID:

select a.id, sum(b.rank)
from A as a join a.Bs as b
group by a.id
order by sum(b.rank)

使用session.get(id)加载A。