2012-03-17 130 views
0

我有兩個表父和子。我有這兩個表爲母公司數據:休眠一對多檢索

PARENT_ID city 
---------------- 
20   B 
22   C 
24   D 

孩子:

CHILD_ID PARENT_CHILD_JOIN  phone 
------------------------------------------ 
2    20      1111 
3    20      2222 
4    22      3333 

我在child.hbm.xml有關這兩個表爲:

<many-to-one name="myMtO" class="com.Parent" fetch="select"> 
     <column name="PARENT_CHILD_JOIN" not-null="true" /> 
</many-to-one> 

。 hbm.xml:

<set name="mySet" table="child" cascade="save-update" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="PARENT_CHILD_JOIN" not-null="true" /> 
     </key> 
<one-to-many class="com.Child" /> 
</set> 

保存我是隻保存parent , session.save(parent); 通過這樣做,子表中的PARENT_CHILD_JOIN值將從父表中的PARENT_ID列自動填充。

現在,這裏我想數據獲取:

select c.phone 
from child c, parent p 
where c.PARENT_CHILD_JOIN = p.PARENT_ID 

但它說PARENT_CHILD_JOIN列中不存在的孩子。這是正確的。既然保存,我沒有明確地設置它。

有人可以告訴我如何檢索這些一對多的數據?

回答

0

HQL使用實體及其屬性。它不使用表和列名稱。

select c.phone from Child c inner join c.myMtO 

注意,此連接(和您的查詢的WHERE子句中)不能起任何作用,因爲所有的孩子都與父(聯接列是不爲空)。

Hibernate文檔有一個whole chapter dedicated to HQL。閱讀。

附註:myMtO真是一個可怕的名字。

+0

謝謝JB。但是,如果我想使用where condtion,因爲我想在查詢中添加where條件選擇c。手機從子c,父p內連接c.myMtO其中p.city ='B',因爲它仍然返回所有結果。 – 2012-03-18 14:52:38

+0

然後給連接的實體一個別名:'從c中選擇c.phone c內部連接c.myMtO父母parent.city ='B'。您是否閱讀過文檔? – 2012-03-18 20:05:36

+0

再次感謝JB的幫助!從文檔中我經歷了where子句部分,並嘗試了一些foo的例子,但沒有成功。但現在它返回正確的結果。謝謝 !!!! – 2012-03-19 11:53:03

2

這是一個SQL問題,而不是真正的休眠問題。有很多方法可以在SQL中修復它(例如減號語句)。 要在Hibernate中模擬相同的行爲,可以使用IN/NOT IN語句。這是我找到的最簡單的方法(考慮到你必須匹配「n」個子列值,而不僅僅是一個)。

更具體的: 1.從子表中選擇列值IN(...)。在FK列上設置投影,或者設置其他列(我將使用FK列,例如parrent的id)。 2.從子表中選擇列值NOT IN(...)。在FK上設置投影,或者您想要的其他列(在這裏相同:我將使用FK列,例如parrent的id)。 3.選擇所有的父母,其中ID IN查詢結果從點1,ID NOT IN查詢結果從第2點。

這樣你也可以確保你不會得到重複的parrent對象。如果你想分頁,你也可以使用我描述的最後一個查詢。

請提供一些反饋,如果有幫助。

希望有所幫助,Nicolae

+0

你有兩個不同的帳戶。請決定你想使用哪一個。 – Dariusz 2013-04-25 19:44:49