让我说我有一个简单的实体类层次结构(使用联接表策略):
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?谢谢