【问题标题】:Ordering results by computed value in Hibernate在 Hibernate 中按计算值排序结果
【发布时间】:2011-01-23 03:15:04
【问题描述】:

我有一个表格 Player,其中包含 id、name、wins、games_played 列。我将它映射到一个类 Player。 我想在 Hibernate 中执行以下查询(最好使用 Criteria,如果无法使用 Criteria HQL 也会有所帮助)

select * from Player order by (wins / 游戏)

我希望 List 按他们的胜率排序。

谢谢你的回答

帕洛

【问题讨论】:

    标签: hibernate orm hql criteria


    【解决方案1】:

    聚会迟到了,但是使用当前版本的 Hibernate(在我的例子中是 5.4)可以做到这一点:

    var cb = entityManager.getCriteriaBuilder();
    var query = cb.createQuery(Player.class);
    var root = query.from(Player.class);
    
    query.orderBy(cb.asc(cb.quot(root.get("wins"), root.get("gamesPlayed"))));
    
    return entityManager.createQuery(query).getResultList();
    

    【讨论】:

      【解决方案2】:

      Hibernate 不支持 order by 子句中的算术表达式。引用 Hibernate 文档的 14.12. The group by clause 部分:

      group by 子句和 order by 子句都不能包含算术表达式。

      事实上,以下 hql 查询不会返回正确排序的结果:

      select p from Player p order by (p.wins/p.gamesPlayed) 
      

      而且我认为您不能分割 org.hibernate.criterion.Property,因此 Criteria API 无法解决此问题。

      所以我建议使用计算属性(带有公式),例如带有注释:

      private float wins;
      private float gamesPlayed;
      @Formula(value = "WINS/GAMESPLAYED")
      private float ratio;
      

      这将允许使用 Criteria API 进行以下查询:

      session.createCriteria(Player.class).addOrder(Order.desc("ratio"))
      

      【讨论】:

      【解决方案3】:

      来自 Hibernate 文档 -

      如果底层数据库支持 SQL 函数和聚合函数,则在 have 和 order by 子句中允许它们。

      http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering

      这意味着你需要根据你的底层数据库来做。

      【讨论】:

      • 感谢您的回答。您知道如何使用 Criteria 执行此操作吗?
      • -1:问题是关于 算术表达式(而不是 SQL 函数或聚合函数),它们在 order by 中支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多