2012-09-06 63 views
1

我希望有人可以用Hibernate命名查詢指向正確的方向。HQL通過收集項目的屬性值總和排序

我想根據集合項目的屬性對結果進行排序。認爲這是由最簡單的例子:

我有2類:A和B

A具有屬性 「BS」,這是一組B的

B具有屬性 「等級」,其是一個整數。

我想查詢(所有)作爲和排序他們的A.Bs.B.N的總和。

喜歡的東西:

select x from A as x order by sum(x.Bs.rank) 

希望這是有道理的!上面的查詢現在拋出一個錯誤「非法嘗試解引用集合」。

回答

0

您必須手動將對錶b的訪問添加到select中,就像在SQL中一樣。在SQL你可以到

select a.key, a.col2, a.col3, ... from a, b 
    where a.key = b.foreignKeyFromA 
    group by a.key, a.col2, a.col3, ... 
    order by sum(b.rank); 

休眠不會產生該訪問自動B,所以你必須手動實現它的HQL語句,像這樣

select new A(a.key, a.col2, a.col3, ...) from A a join B b 
    group by a.key, a.col2, a.col3, ... 
    order by sum(b.rank) 

(您需要的配件構造對於A或者你可以找回帶有單個值的對象數組,A和B之間的關係必須在映射中定義;可能情況已經如此)

備註:在group by子句中,您必須提及您選擇的所有列,即使是不要再更改分組了(密鑰已經是唯一的)。如果您沒有提及所有選定的列,則會在Oracle數據庫上發生錯誤。 MySQL不需要這個,group by a.key就足夠了,但是你應該編寫主要在所有數據庫上工作的HQL語句。

+0

它不是很工作。 A和B被映射。 A級定義: 所以我有一個單獨的表(a_b)映射a和b之間的關係。 我需要選擇新的A(),我不能使用select * from A嗎? 非常感謝您的建議。 – Nes

+0

哦,我忘記提到我的數據庫是MySQL。 – Nes

+0

如果您選擇了新的A(a.key,a.col2,...),那麼您將得到一個A實例列表。如果您選擇了a.key,col2,...,那麼您會得到對象數組列表。兩者都是可能的,我的代碼更多的是一個例子。但是你不能在HQL中選擇A. *',並且它不能在組中使用(至少在Oracle中)。 - 你的意思是「不太有效」,究竟哪個不起作用(哪個錯誤信息或哪個錯誤結果)? - 你真的有很多tomany的關係嗎?在你的例子中,它也可以是一對多的,這更容易處理。 – Johanna

0

如果A是複雜或繼承,您可能希望只得到它的id:使用A的session.get(id)

select a.id, sum(b.rank) 
from A as a join a.Bs as b 
group by a.id 
order by sum(b.rank) 

負載。

相關問題