Допустим, у меня есть простая иерархия классов сущностей (с использованием стратегии объединенной таблицы):
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
, поэтому в результате я 'будет иметь данные из всех экземпляров всех подклассов.Но мне нужно иметь его в кортеже (не как экземплярах сущностей), потому что в подклассах есть другие более сложные ассоциации с другими сущностями, но в то время мне не нужны эти ассоциации, поэтому я не хочу, чтобы они загружались издБ как часть экземпляров объекта.Поэтому я не хочу использовать простой подход.
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Присоединяется к таблице подклассов, поэтому полученный 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 не является деформированным, но он содержит простые соединения (не осталось) с вкладками подклассов, поэтому результат всегда пуст, потому что не может быть записи, которая одновременно представляет экземпляр классов A, B и C a.
Итак, мой вопрос: возможно ли это с помощью Criteria api?Или мне нужно использовать нативный SQL?Thx