在Hibernate中按计算值排序结果

时间:2010-03-03 10:03:36

标签: hibernate orm hql criteria

我有一个包含列id,名称,胜利,games_played的表格播放器。我将它映射到类Player。 我想在Hibernate中执行以下查询(最好使用Criteria,如果不可能使用Criteria HQL也会有帮助)

  

从玩家订单中选择*(赢/   games_played)

我希望得到List< Player>按胜率排序。

感谢您的回答

帕洛阿

3 个答案:

答案 0 :(得分:11)

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"))

答案 1 :(得分:2)

来自Hibernate文档 -

  

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

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

这意味着您需要根据底层数据库执行此操作。

答案 2 :(得分:0)

迟到聚会,但是使用当前版本的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();