[英]Hibernate Query Criteria for mappings involving inheritance
假設類“X”映射到表“X”,類“A”映射到表“A”,類“B”映射到表“B”。
表X結構:(X_ID,其他一些列表A結構:(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 查詢,我需要使用 hibernate criteria 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"));
但是,如果我們檢查映射文件,A 中沒有 B 的直接引用。因此 hibernate 會拋出“B not related to A”實體。
有什么方法可以在查詢條件中映射這種繼承
您根本不需要在標准中引用A
或使用任何別名。
Criteria c = session.createCriteria(B.class);
.add(Restrictions.eq("sex", "M"))
.add(Restrictions.eq("name", "XYZ"));
會給你你需要的結果。
由於InheritanceType.Joined
,這可能會生成包含與A
表的連接的 SQL(類似於您顯示的 sql),但沒有必要在條件中指定該連接。
標准中看起來像列的東西實際上是對 Java 對象中字段的(反射)引用。 Hibernate 從您的注釋中找出要放入 sql 中的列,並且如果需要的話,應該根據繼承注釋連接到 A 表。
為了在您的上下文中確定這一點,並更好地理解所有這些,我建議您嘗試並打開生成的 sql 的日志記錄,如this answer to another SO hibernate question 中所述。
試試這個方法: Criteria rootCrit = session.createCriteria(A.class); rootCrit.createAlias("B", "B"); rootCrit.add(Restrictions.eq("B.sex", "M")); rootCrit.add(Restrictions.eq("B.name", "XYZ"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.