我有一個表,其中列id爲id,name,wins,games_played。我將它映射到類Player。 我想這樣做在Hibernate中下面的查詢(最好用的標準,如果沒有可能與標準HQL也將幫助)按Hibernate中的計算值排序的結果
SELECT * FROM播放器,以便通過(勝/ games_played)
我期望獲得名單<球員>按他們的勝率排序。
感謝您的回答
帕羅奧
我有一個表,其中列id爲id,name,wins,games_played。我將它映射到類Player。 我想這樣做在Hibernate中下面的查詢(最好用的標準,如果沒有可能與標準HQL也將幫助)按Hibernate中的計算值排序的結果
SELECT * FROM播放器,以便通過(勝/ games_played)
我期望獲得名單<球員>按他們的勝率排序。
感謝您的回答
帕羅奧
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
這樣的標準API不會解決這個問題。
所以我建議使用一個計算的屬性(公式),例如用註釋:
private float wins;
private float gamesPlayed;
@Formula(value = "WINS/GAMESPLAYED")
private float ratio;
這將允許該標準API以下查詢:
session.createCriteria(Player.class).addOrder(Order.desc("ratio"))
從Hibernate文檔 -
SQL函數和聚合函數by子句的有秩序被允許,如果他們是由底層的數據庫支持。
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering
這意味着你需要根據你的基礎數據庫做到這一點。
謝謝你的答案。你有什麼想法如何與標準做到這一點? – Palo
-1:問題是關於*算術表達式*(而不是SQL函數或聚合函數),它們的順序是** NOT **。 –
這也適用於使用Formula()方法進行流暢映射的.NET。 – andypaxo