让我们说类'X'映射到表'X'类'A'映射到表'A'而Class'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与A无关”实体。
是否可以在查询crteria
中映射此继承答案 0 :(得分:1)
您根本不需要在标准中引用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表。
为了在你的上下文中确定这一点,并且为了更好地理解这一点,我建议尝试并将this answer中描述的生成的sql的日志记录打开到另一个SO休眠问题。< / p>
答案 1 :(得分:0)
尝试这种方式: 标准rootCrit = session.createCriteria(A.class); rootCrit.createAlias(&#34; B&#34;,&#34; B&#34;); rootCrit.add(Restrictions.eq(&#34; B.sex&#34;,&#34; M&#34;)); rootCrit.add(Restrictions.eq(&#34; B.name&#34;,&#34; XYZ&#34;));