2010-01-29 68 views
6

我在父實體和子實體之間有一對多映射。現在我需要找到父母名單中與每位父母關聯的子女人數。我正在嘗試使用HQL來做到這一點,但我不知道如何才能在那裏獲得父母名單。另外,我不知道如何返回實體本身,而不僅僅是它的ID。我目前的HQL查詢是:通過HQL獲得兒童數量

select new map(parent.id as parentId, count(*) as childCount) 
from Parent parent left join parent.children children 
group by parent.id 

但這隻會返回ID並且不會篩選特定的父項。

編輯 基於帕斯卡的答案,我已經修改了查詢

select new map(parent as parent, count(elements(parent.children)) as childCount) 
from Parent parent 
group by parent 

也沒有工作,但過於緩慢:30秒,而不是400毫秒的同一個數據庫。

+0

事實上,這是可怕的慢。實際上難以接受... – 2010-01-29 16:32:24

+0

索引可能(強調可能)有助於提高速度,但另一種選擇是將hql查詢分解爲若干部分(如果可以的話) - 我發現有時可以提供幫助。或者你可以爲每個父元素執行單獨的查詢,並自己創建地圖。一個好的數據庫分析器可能有助於探索。 – aperkins 2010-01-29 20:37:14

+0

我最終選擇的解決方案是首先從數據庫中檢索所有父項,然後運行查詢,該查詢給出了父項ID和計數,然後使用Java合併兩項。無論如何,我必須得到所有的父母,並且將這份名單與孩子數量合併的時間不到一秒鐘,在這種情況下沒有問題。 – 2010-01-30 15:57:28

回答

4

我不是100%肯定這一點,但你看這個:

select new map(parent.id, count(elements(parent.children))) 
from Parent parent group by parent.id 
+0

不起作用,當執行此操作時,我得到一個SQL異常,因爲生成的SQL組由parent.id生成,但也選擇了大量其他列。 – 2010-01-29 12:05:58

+0

@Thomas是的,的確,我已經相應地更新了我的答案 – 2010-01-29 12:26:04

0

謝謝。我正在尋找一個特定父母的孩子數量,你的帖子讓我朝着正確的方向前進。

萬一別人需要找到孩子的特定父的數量,你可以使用這樣的事情:

Query query = this.sessionFactory.getCurrentSession().createQuery("select count(elements(parent.children)) from Parent parent where name = :name"); 
query.setString("name", parentName); 
System.out.println("count = " + query.uniqueResult());