我希望有人可以通过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)
希望这是有道理的!上面的查询现在抛出一个错误“非法尝试取消引用收集”。
答案 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。