簡體   English   中英

涉及繼承的映射的 Hibernate 查詢條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM