2012-07-05 63 views
2

可以說類'X'映射到表'X'類'A'映射到表'A',而類'B'映射到表'B'。Hibernate標準API查詢繼承問題

表X結構式:(X_ID,一些其它列 表的結構:(A_ID,X_ID,其他一些列) 表B結構:(A_ID,其他一些列)...表B也有A_ID

'B' 級擴展類 'A'我們有映射文件兩者爲:

類 'A' 父映射文件:

@Entity 
@Table(name = 'A') 
@Inheritance(stratergy=InheritanceType.Joined) 
public abstract class A { 
@Id @Clumns(name = "A_Id) 
@GeneratedValue 
protected Long aId; 
-- some more A specific fields 
} 

「B」級映射文件:

@Entity 
@Table(name= 'B') 
Public class B extends A{ 
---- B specific fields 
} 

現在,我有一個SQL查詢,如下我需要使用休眠標準API來編寫。

select * from X 
INNER JOIN A 
ON X.id = A.id 
INNER JOIN B 
ON A.id = B.id 
where B.name = 'XYZ' 
    and B.Sex = 'M' 

我想出了:

Criteria c = session.createCriteria(x.class, "x"); 
        .createAlias("x.a", "a") 
        .createAlias("a.b", "b")   
        .add(Restrictions.eq("b.sex", "M")) 
        .add(Restrictions.eq("b.name", "XYZ")); 

但是,如果我們檢查映射文件中,有B的A中沒有直接提到因此休眠拋出「B不相關的A」實體。

有什麼辦法這個繼承可以查詢crteria映射

回答

1

B是-A A.所以,你不需要做A和B之間的Hibernate任何連接會替你:

Criteria c = session.createCriteria(x.class, "x"); 
        .createAlias("x.a", "b") 
        .add(Restrictions.eq("b.sex", "M")) 
        .add(Restrictions.eq("b.name", "XYZ")); 
+0

謝謝...像一個魅力工作...我應該早點知道它...現在很高興知道它.. – user1502377 2012-07-05 15:02:28