как оставить соединение двух несвязанных объектов с API критериев JPA?

используя JPA 2.1 и hibernate 5.1.x, это возможно с JPQL

select s.lowerBound,
l.status
...
from Serie s
left join Line l on
s.lowerBound between l.lineStart and l.lineEnd

как мне написать это, используя Criteria API? я пытался это

Root<Serie> serieRoot = query.from(Serie.class);
Root<Line> lineRoot query.from(Line.class);
query.where(criteriaBuilder.between(s.get("lowerBound"), l.get("lineStart"), s.get("lineEnd")))

но это не позволяет мне указать, что это левое соединение.


person kfc    schedule 24.01.2017    source источник


Ответы (1)


То, что вы делаете со своим запросом Criteria, не позволяет указать это как левое соединение, потому что на самом деле это не левое соединение. У вас просто есть несколько корней в вашем запросе, и в соответствии с Документация Hibernate, в которой используются декартовы произведения, однако с левым соединением вы получаете нули справа, если совпадений нет.

Поскольку интерфейс формы позволяет вам только создавать соединения из атрибутов вашей сущности, я думаю, что вы хотите достичь невозможно с помощью Criteria API. Вам нужно либо сделать два запроса к базе данных, либо использовать JPQL или SQL, чтобы сделать это в одном запросе.

person ytg    schedule 25.02.2017
comment
жаль, что это нельзя сделать с API критериев. каждому подходу, будь то JPQL или API критериев, не хватает некоторых функций, которые есть у другого. это расстраивает - person kfc; 28.02.2017