我有一个包含列id,名称,胜利,games_played的表格播放器。我将它映射到类Player。 我想在Hibernate中执行以下查询(最好使用Criteria,如果不可能使用Criteria HQL也会有帮助)
从玩家订单中选择*(赢/ games_played)
我希望得到List< Player>按胜率排序。
感谢您的回答
帕洛阿
答案 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();