【问题标题】:HQL sorting by sum of collection items' property valueHQL 按集合项的属性值总和排序
【发布时间】:2012-09-06 09:40:48
【问题描述】:

我希望有人可以通过 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)

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

【问题讨论】:

    标签: hibernate sum hql named


    【解决方案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 语句。

    【讨论】:

    • 它不太工作。 A 和 B 已映射。 A类定义: 所以我有一个单独的表 (a_b) 映射 a 和 b 之间的关系。我是否需要 select new A(),我可以不使用 select * from A 吗?非常感谢您迄今为止的建议。
    • 哦,我忘了说我的数据库是 MySQL。
    • 如果你select new A(a.key, a.col2, ...),那么你会得到一个A的实例列表。如果你这样做select a.key, col2, ...,那么你会得到一个对象数组的列表。两者都是可能的,我的代码更像是一个例子。但是您不能在 HQL 中使用 select A.*,并且它不适用于 group by(至少在 Oracle 中)。 - “不太正常”是什么意思?究竟是什么不起作用(哪个错误消息或哪个错误结果)? - 你真的有多对多关系吗?在您的示例中,它也可以是一对多的,这更容易处理。
    • 抱歉有点含糊。由于没有完全工作,我的意思是我得到了结果,但它们没有按要求排序。我现在有select x from A as x join x.bs as y order by sum(y.rank) desc
    • 另外我不是说选择 A.*,抱歉。我的意思是 select x from A as x 会选择我相信的所有列?是的,它是多对多映射。
    【解决方案2】:

    如果 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 2012-02-13
      • 1970-01-01
      • 2015-12-27
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多