2016-07-05 69 views
0

假設,我們有3個實體休眠針對不同的相同的別名加入

<class name="AEntity" table="A" abstract="true"> 
    <id name="id"> 
     <column name="ID"/> 
    </id> 

    <joined-subclass table="Aa" name="AaEntity"> 
     <key column="key"/> 
     <many-to-one name="b" class="BEntity"> 
      <column name="B_ID"/> 
     </many-to-one> 
    </joined-subclass> 

    <joined-subclass table="Ab" name="AbEntity"> 
     <key column="key"/> 
     <many-to-one name="b" class="BEntity"> 
      <column name="B_ID"/> 
     </many-to-one> 
    </joined-subclass> 
</class> 

<hibernate-mapping> 
    <class name="Parent" table="parent"> 
     <id name="id"> 
      <column name="ID"/> 
     </id> 
     <many-to-one name="a" class="AEntity"> 
      <column name="a_ID" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="BEntity" table="B"> 
     <id name="id"> 
      <column name="ID"/> 
     </id> 
    </class> 
</hibernate-mapping> 

然後,我們做標準要求

Criteria criteria = session.createCriteria(Parent.class); 
criteria.createAlias("a","a"); 
criteria.createAlias("a.b","b"); 
criteria.list(); 

並獲得next sq l

select this_.ID as ID1_5_3_, 
     this_.a_ID as a2_5_3_, 
     a1_.ID as ID1_2_0_, 
     a1_.B_ID as B2_2_0_, 
     a1_1_.B_ID as B2_0_0_, 
     a1_2_.B_ID as B2_1_0_, 
     case when a1_1_.key is not null then 1 when a1_2_.key is not null then 2 when a1_.ID is not null then 0 end as clazz_0_, 
     b2_.ID as ID1_3_1_, 
     b2_.C_ID as C2_3_1_, 
     b2_.ID as ID1_3_2_, 
     b2_.C_ID as C2_3_2_ 
from parent this_ 
inner join A a1_ on this_.a_ID=a1_.ID 
left outer join Aa a1_1_ on a1_.ID=a1_1_.key 
left outer join Ab a1_2_ on a1_.ID=a1_2_.key 
inner join B b2_ on a1_1_.B_ID=b2_.ID 
inner join B b2_ on a1_2_.B_ID=b2_.ID 

我們可以看到B表連接兩次並且有相同的名字b2_。它是錯誤嗎?以及如何使兩個連接但具有不同名稱的B表。 好嗎?

回答

0

嘗試別名像

Criteria criteria = session.createCriteria(Parent.class, "parent"); 
criteria.createAlias("parent.a","a"); 
criteria.createAlias("parent.a.AaEntity.b","aab"); 
criteria.createAlias("parent.a.AbEntity.b","abb"); 
criteria.list(); 

PS:我沒有測試過這一點,它可能無法正常工作,因爲它是,但這樣會給你如何強制別名的想法。

+0

我明白了,但「無法解析屬性:AaEntity:ru.todo100.hibernate.AEntity」 –

+0

我看到兩者都是「連接子類」,它們都指的是相同的「多對一」 '實體。你可以評論出'criteria.createAlias(「a.b」,「b」);'並嘗試?我希望你可能需要遵循不同的策略(每個班級都有鑑別器列) –

+0

如果我評論這一行,那麼就沒有聯合。這種策略存在,因爲可能是沒有「b」字段的第三個子類,但是第一個和第二個子類。每個AaEntity和BbEntity都有自己的實體。我每天都會搜索Google,但在這個主題上沒有任何答案......許多人問道並保持沉默。我找到解決方案,因爲應用程序的架構具有當前結構我認爲這是冬眠bug ..... –