gpt4 book ai didi

java - Hibernate标准查询具有相同字段名称的子类

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:55 24 4
gpt4 key购买 nike

考虑一个类 A,它是 B 和 C 的父类。

@Table(name = "a")
@Inheritance(strategy = InheritanceType.JOINED)
public class A {}

@Table(name = "b")
public class B extends A {
private String status;
}

@Table(name = "c")
public class C extends A {
private String status;
}

现在,当我执行以下条件查询(对于 a 类)时:

criteria.add(Restrictions.eq("someString", status))

我的项目中有类似的设置,但生成的查询不会产生正确的结果。 Hibernate正在使用表b而不是表c的状态列(似乎无法确定正确的状态列)。

这就是生成的 native 查询的样子:

SELECT * FROM a outer join b on a.id = b.id outer join c on a.id = c.id WHERE b.status = "someStatus"

虽然功能正确,但应该是

SELECT * FROM a outer join b on a.id = b.id outer join c on a.id = c.id WHERE (b.status = "someStatus" or c.status = "someStatus")

这是正确的,因为只有 c 或 b 不会为空,因为在 java 中不可能有一个实体同时是 b 和 c。

当对 B.status 进行查询时,结果是好的。虽然有人可能会认为使用相同的列名是糟糕的设计,或者开始讨论这是否是 hibernate 中的一个错误,但我想知道是否有某种方法可以使 hibernate 更清楚应该使用哪个表。

在 hibernate/criteria 中是否有一种方法可以唯一指定我要过滤的字段位于哪个子类中?

最佳答案

首先,我认为你应该在类“a”上拥有“status”属性,这样,b和c就可以继承相同的属性。我可以看到您正在使用“InheritanceType.JOINED”策略,那么您应该设置一个 id 来连接两个表,如下所示:

@PrimaryKeyJoinColumn(name="ID")

现在,您正在连接两个表,但实际上它们是不同的表,那么如果您想过滤某些特定列,您必须以数据库管理员的身份指定正确的表。

Criteria criteria = session.createCriteria(b.class);
criteria.add(Restrictions.eq("someString", status));

希望这些信息对您有所帮助。

祝你好运。

关于java - Hibernate标准查询具有相同字段名称的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35846435/

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