JPA Criteria API: получить атрибуты всех подклассов в один кортеж - PullRequest
0 голосов
/ 25 февраля 2019

Допустим, у меня есть простая иерархия классов сущностей (с использованием стратегии объединенной таблицы):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...