Hibernate条件查询具有相同字段名称的子类

时间:2016-03-07 14:37:26

标签: java hibernate orm criteria

考虑一个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(似乎无法确定正确的列)。

这就是生成的本机查询的样子:

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才是非null,因为在java中不可能有一个同时可以同时为b和c的实体。

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

在hibernate / criteria中是否有一种方法可以唯一地指定我正在过滤的字段所在的子类?

1 个答案:

答案 0 :(得分:0)

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

@PrimaryKeyJoinColumn(name="ID")

现在,您正在连接两个表,但实际上它们是不同的表,那么如果要过滤某些特定列,则必须指出正确的表,并将其视为数据库管理器。

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

我希望这些信息可以帮到你。

祝你好运。