gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:18:14 27 4
gpt4 key购买 nike

假设类“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 查询,我需要使用 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中映射这种继承

最佳答案

您根本不需要在条件中引用 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 的日志记录,如 this answer 中所述。另一个SO hibernate 问题。

关于java - 涉及继承的映射的 Hibernate 查询条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com