Hibernate查询条件涉及继承的映射

可以说类'X'被映射到表'X'类'A'被映射到表'A'并且类'B'被映射到表'B'。

表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查询,我需要使用hibernate标准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中映射这个继承


根本不需要在条件中引用A ,或者使用任何别名。

Criteria c = session.createCriteria(B.class);
                    .add(Restrictions.eq("sex", "M"))
                    .add(Restrictions.eq("name", "XYZ"));

会给你你需要的结果。

由于InheritanceType.Joined ,这可能会生成SQL,其中包括到A表的连接(与您显示的SQL接近),但没有必要在条件中指定该连接。

看起来像条件​​中的列的东西实际上是对Java对象中的字段的(反射)引用。 Hibernate根据你的注解找出要放入sql的列,并且如果需要基于继承注释来连接A表。

为了在你的上下文中确定这一点,并且更好地理解所有这些,我建议尝试一下,然后开启记录生成的sql的记录,如同在这个答案中描述的另一个SO休眠问题。


尝试这种方式:标准rootCrit = session.createCriteria(A.class); rootCrit.createAlias(“B”,“B”); rootCrit.add(Restrictions.eq(“B.sex”,“M”)); rootCrit.add(Restrictions.eq(“B.name”,“XYZ”));

链接地址: http://www.djcxy.com/p/37053.html

上一篇: Hibernate Query Criteria for mappings involving inheritance

下一篇: Detached criteria on composite PK fields?