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表。 好嗎?
我明白了,但「無法解析屬性:AaEntity:ru.todo100.hibernate.AEntity」 –
我看到兩者都是「連接子類」,它們都指的是相同的「多對一」 '實體。你可以評論出'criteria.createAlias(「a.b」,「b」);'並嘗試?我希望你可能需要遵循不同的策略(每個班級都有鑑別器列) –
如果我評論這一行,那麼就沒有聯合。這種策略存在,因爲可能是沒有「b」字段的第三個子類,但是第一個和第二個子類。每個AaEntity和BbEntity都有自己的實體。我每天都會搜索Google,但在這個主題上沒有任何答案......許多人問道並保持沉默。我找到解決方案,因爲應用程序的架構具有當前結構我認爲這是冬眠bug ..... –