2

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

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

我有 2 个班级:A 和 B

A 有一个属性“Bs”,它是 B 的集合。

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

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

就像是:

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

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

4

2 回答 2

1

您必须将对表 b 的访问手动添加到选择中,就像在 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 语句。

于 2012-09-06T12:12:10.747 回答
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)

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

于 2012-09-06T13:00:21.990 回答