Возможно ли запросить «UNION» в JPA и даже «Criteria Builder»?UNION to JPA Query
Я ищу примеры, но до сих пор я не получил никакого результата.
У кого-нибудь есть примеры того, как его использовать?
Или это было бы с родным sql?
Возможно ли запросить «UNION» в JPA и даже «Criteria Builder»?UNION to JPA Query
Я ищу примеры, но до сих пор я не получил никакого результата.
У кого-нибудь есть примеры того, как его использовать?
Или это было бы с родным sql?
SQL поддерживает UNION, но JPA 2.0 JPQL этого не делает. Большинство профсоюзов можно сделать с точки зрения объединения, но некоторые не могут, а некоторые из них сложнее выразить с помощью объединений.
Но EclipseLink поддерживает UNION. Итак, используйте EclipseLink вместо JPA.
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION ссылка на электронные документы с примерами – Chris
В зависимости от случая, можно использовать подзапросы, что-то вроде:
select e
from Entity e
where e.id in
(
select e.id
from Entity2 e2
join e2.entity e
where e2.someProperty = 'value'
)
or e.id in
(
select e.id
from Entity3 e3
join e3.entity e
where e3.someProperty = 'value2'
)
Как обрабатывать сценарий, если в подзапросе есть более 1000 результатов? – user613114
Для MS SQL это на самом деле более 2000, что не меняет того факта, что он не сработает. Вы можете получить все эти идентификаторы, а затем разделить результирующий список на предел, который вы хотите установить, а затем выполнить запрос для всех подсписок и объединить результаты. Это не так плохо, учитывая то, как работает JPA, но, как всегда, это зависит от вашего варианта использования. – szczepanpp
Не говоря уже о том, что определенное использование UNION заключается в том, чтобы избежать ИЛИ (при настройке производительности SQL). У меня лично есть суб-выражение с OR, что очень медленно. После переписывания, чтобы использовать объединение, он становится более быстрым. Теперь я должен найти решение для его создания с помощью CriteriaBuilder :( – takacsot
Одно только приходит на ум (поиск той же самой задачи):
Выполнение двух различных запросов JPA на одно и то же отображение сущности и просто добавить объекты второго результата в список (или установить, чтобы избежать дублирования) первого результата.
Таким образом, вы получаете тот же эффект, что и с UNION, разница заключается в том, что вы используете два оператора SQL вместо одного. Но на самом деле я бы ожидал, что это будет так же хорошо, как и выпуск одного заявления UNION.
гений !!! должен считаться лучшим ответом, пока JPQL не поддерживает объединения –
Ну, это одно из очевидных обходных решений, но я также хочу упорядочить результаты вместе, например, и я предпочитаю делать это в sql, чем в java – kopelitsa
Но это не вопрос, копелица, и вы всегда можете использовать SQL и делать представления. – cslotty
Вы можете напрямую использовать UNION в своем запросе. Следующий запрос возвращает идентификатор друзей из таблицы FRIENDSHIP.
Например:
TypedQuery<String> queryFriend = em.createQuery("SELECT f.Id FROM Friendship f WHERE f.frStuId = :stuId UNION "
+ "SELECT f.frStuId FROM Friendship f WHERE f.FriendId = :stuId", String.class);
queryFriend.setParameter("stuId", stuId);
List<String> futureFriends = queryFriend.getResultList();
Errm nope. У JPQL нет «UNION», так как все ответы говорят вам. Единственный способ, который принимает JPA-провайдер, если он предоставляет РАСШИРЕНИЕ ПРОГРАММЫ. И сказал ли OP, что используется JPA-провайдер? Неа. – DN1
возможно дубликат [Union All и Сумма с JPA CriteriaBuilder] (http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder) – danizmax