JPA Criteria API:将所有子类的属性放入单个Tuple中

时间:2019-02-25 14:30:50

标签: java hibernate jpa criteria

让我说我有一个简单的实体类层次结构(使用联接表策略):

public class A {
   private String attrA;
}

public class B extends A { 
   private String attrB;
}

public class C extends A {
   private String attrC;
}

,并希望执行选择

SELECT A.attrA, B.attrB, C.attrC from A LEFT OUTER JOIN B LEFT OUTER JOIN C

因此,我将获得所有子类的所有实例的数据。但是我需要将其放在元组中(而不是作为实体实例),因为子类中与其他实体之间存在一些更复杂的关联,但是我当时不需要这些关联,因此我不希望从中加载它们db作为实体bean实例的一部分。所以我不想使用简单的方法。

cb.select(cb.from(A.class));

我需要类似的东西

CriteriaQuery<Tuple> criteria = cb.createTupleQuery();
Root<A> a = criteria.from(A.class);
Root<B> b = cb.treat(a, B.class);
Root<C> c = cb.treat(a, C.class);
criteria.select(cb.tuple(
    a.get(A_.attrA), b.get(B_.attrB), c.get(C_.attrC)
)).where(...);

不幸的是,这不起作用,因为结果SQL不包含子类表的LEFT JOIN,因此结果SQL格式错误。

我尝试过的另一种方式:

CriteriaQuery<Tuple> criteria = cb.createTupleQuery();
Root<A> a = criteria.from(A.class);
criteria.select(cb.tuple(
    a.get(A_.attrA), cb.treat(a, B.class).get(B_.attrB), cb.treat(a, C.class).get(C_.attrC)
)).where(...);

这显然也不起作用。产生的SQL格式不正确,但它包含子类tabkes的简单JOIN(无剩余),因此结果始终为空,因为不能有记录同时表示A,B和C类的实例。

所以我的问题是:是否可以使用Criteria api?还是我需要使用本机SQL?谢谢

0 个答案:

没有答案