2013-09-23 3 views
9

Возможно ли запросить «UNION» в JPA и даже «Criteria Builder»?UNION to JPA Query

Я ищу примеры, но до сих пор я не получил никакого результата.

У кого-нибудь есть примеры того, как его использовать?

Или это было бы с родным sql?

+0

возможно дубликат [Union All и Сумма с JPA CriteriaBuilder] (http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder) – danizmax

ответ

15

SQL поддерживает UNION, но JPA 2.0 JPQL этого не делает. Большинство профсоюзов можно сделать с точки зрения объединения, но некоторые не могут, а некоторые из них сложнее выразить с помощью объединений.

Но EclipseLink поддерживает UNION. Итак, используйте EclipseLink вместо JPA.

+1

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION ссылка на электронные документы с примерами – Chris

15

В зависимости от случая, можно использовать подзапросы, что-то вроде:

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' 
) 
+0

Как обрабатывать сценарий, если в подзапросе есть более 1000 результатов? – user613114

+0

Для MS SQL это на самом деле более 2000, что не меняет того факта, что он не сработает. Вы можете получить все эти идентификаторы, а затем разделить результирующий список на предел, который вы хотите установить, а затем выполнить запрос для всех подсписок и объединить результаты. Это не так плохо, учитывая то, как работает JPA, но, как всегда, это зависит от вашего варианта использования. – szczepanpp

+0

Не говоря уже о том, что определенное использование UNION заключается в том, чтобы избежать ИЛИ (при настройке производительности SQL). У меня лично есть суб-выражение с OR, что очень медленно. После переписывания, чтобы использовать объединение, он становится более быстрым. Теперь я должен найти решение для его создания с помощью CriteriaBuilder :( – takacsot

4

Одно только приходит на ум (поиск той же самой задачи):

Выполнение двух различных запросов JPA на одно и то же отображение сущности и просто добавить объекты второго результата в список (или установить, чтобы избежать дублирования) первого результата.

Таким образом, вы получаете тот же эффект, что и с UNION, разница заключается в том, что вы используете два оператора SQL вместо одного. Но на самом деле я бы ожидал, что это будет так же хорошо, как и выпуск одного заявления UNION.

+1

гений !!! должен считаться лучшим ответом, пока JPQL не поддерживает объединения –

+0

Ну, это одно из очевидных обходных решений, но я также хочу упорядочить результаты вместе, например, и я предпочитаю делать это в sql, чем в java – kopelitsa

+0

Но это не вопрос, копелица, и вы всегда можете использовать SQL и делать представления. – cslotty

0

Вы можете напрямую использовать 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(); 
+0

Errm nope. У JPQL нет «UNION», так как все ответы говорят вам. Единственный способ, который принимает JPA-провайдер, если он предоставляет РАСШИРЕНИЕ ПРОГРАММЫ. И сказал ли OP, что используется JPA-провайдер? Неа. – DN1