Hibernate标准API查询继承问题

时间:2012-07-05 13:48:36

标签: java hibernate

让我们说类'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

中映射此继承

1 个答案:

答案 0 :(得分: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"));