2010-03-03 64 views
6

我有一個表,其中列id爲id,name,wins,games_played。我將它映射到類Player。 我想這樣做在Hibernate中下面的查詢(最好用的標準,如果沒有可能與標準HQL也將幫助)按Hibernate中的計算值排序的結果

SELECT * FROM播放器,以便通過(勝/ games_played)

我期望獲得名單<球員>按他們的勝率排序。

感謝您的回答

帕羅奧

回答

9

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

這也適用於使用Formula()方法進行流暢映射的.NET。 – andypaxo

2

從Hibernate文檔 -

SQL函數和聚合函數by子句的有秩序被允許,如果他們是由底層的數據庫支持。

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

這意味着你需要根據你的基礎數據庫做到這一點。

+1

謝謝你的答案。你有什麼想法如何與標準做到這一點? – Palo

+0

-1:問題是關於*算術表達式*(而不是SQL函數或聚合函數),它們的順序是** NOT **。 –