0

假设类'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 查询,我需要使用休眠条件 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 无关”实体。

有什么方法可以在查询条件中映射这种继承

4

2 回答 2

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 表。

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

于 2012-07-05T00:35:09.330 回答
0

试试这个方法: Criteria rootCrit = session.createCriteria(A.class); rootCrit.createAlias("B", "B"); rootCrit.add(Restrictions.eq("B.sex", "M")); rootCrit.add(Restrictions.eq("B.name", "XYZ"));

于 2012-07-05T11:14:19.190 回答