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

Java 涉及继承的映射的Hibernate查询条件,java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,假设类“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 @Clu

假设类“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
}
@Entity
@Table(name= 'B')
Public class B extends A{
---- B specific fields
}
类“B”映射文件:

@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
}
@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无关”实体


有没有办法将此继承映射到查询条件中?您不需要在条件中引用
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表

为了在您的上下文中确定这一点,并更好地理解这一切,我建议您尝试一下,并按照另一个SO hibernate问题中所述打开生成sql的日志记录。

尝试以下方法: criteriarootcrit=session.createCriteria(A.class); rootCrit.createAlias(“B”、“B”); rootCrit.add(Restrictions.eq(“B.sex”,“M”));
rootCrit.add(Restrictions.eq(“B.name”,“XYZ”));

感谢您的回复……但是,如果我在条件中没有提到“A”。我需要从“A”中购买的列将如何购买?假设我们有另一个表X,它与“A”连接,并且A具有带有“B”的子类功能。那么我的条件将变成:条件c=session.createCriteria(X.class,“X”);.createAlias(“X.a”,“a”).createAlias(“a.b”,“b”)。添加(Restrictions.eq(“b.sex”,“M”))。添加(Restrictions.eq(“b.name”,“X”,“XYZ”));那么我如何绕过“A”,因为X只与“A”相关,而不与“B”相关,这是一个值得尝试的问题。如果你想在“X”中得到一些东西,你需要一个连接,但你可能仍然不需要提到“A”。我必须玩一个例子……嗨,tarun,我刚刚修改了这个问题。现在表X和A之间有另一个连接,无法实现获取正确的查询条件?