2013-09-23 12 views
9

Czy można zapytać "UNION" w JPA, a nawet "Builder kryteriów"?UNION na zapytanie JPA

Poszukuję przykładów, ale jak na razie nie mam wyników.

Czy ktoś ma przykłady tego, jak z niego korzystać?

A może to być z natywnym sql?

+0

możliwe duplikat [Unii wszystkich i Sum z JPA CriteriaBuilder] (http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder) – danizmax

Odpowiedz

15

SQL obsługuje UNION, ale JPA 2.0 JPQL nie. Większość związków można zrobić w kategoriach złączeń, ale niektóre nie, a niektóre są trudniejsze do wyrażenia za pomocą złączeń.

Ale EclipseLink obsługuje UNION. Tak, użyj EclipseLink zamiast JPA.

+1

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION link do dokumentów EL z przykładami – Chris

15

W zależności od przypadku, można użyć sub zapytania, coś jak:

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

Jak obsługiwać scenariusz, jeśli w podkwerendy ma więcej niż 1000 wyników? – user613114

+0

Dla MS SQL to właściwie ponad 2000, co nie zmienia faktu, że nie zadziała. Można pobrać wszystkie te listy id, a następnie podzielić listę wynikową według limitu, który chcesz ustawić, a następnie wykonać zapytanie dla wszystkich podlist i dołączyć wyników. Nie jest tak źle biorąc pod uwagę sposób, w jaki działa JPA, ale potem, jak zwykle, zależy to od twojego przypadku użycia. – szczepanpp

+0

Nawet nie wspominając, że pewne użycie UNION dotyczy unikania OR (przy dostrajaniu wydajności SQL). Osobiście mam podekspresję z OR, która jest bardzo powolna. Po przepisaniu, aby użyć związku, staje się ono szybsze. Teraz muszę znaleźć rozwiązanie, aby zbudować go za pomocą CriteriaBuilder :( – takacsot

4

Jedno tylko przychodzi mi do głowy (szukają dokładnie tego samego problemu):

Wykonać dwa różne kwerend WZP na tym samym odwzorowaniu encji i po prostu dodaj obiekty drugiego wyniku do listy (lub ustaw, aby uniknąć duplikatów) pierwszego wyniku.

W ten sposób uzyskuje się taki sam efekt jak w przypadku UNION, z tą różnicą, że używa się dwóch instrukcji SQL zamiast jednego. Ale w rzeczywistości oczekiwałbym, że będzie to równie dobre, jak wydawanie jednego oświadczenia UNION.

+1

powinno być najlepszą odpowiedzią, dopóki JPQL nie będzie wspierało związków –

+0

Cóż, to jest jedno z oczywistych obejść, ale ja też chcę zamówić wyniki razem na przykład i wolę to zrobić w sql niż w java – kopelitsa

+0

Ale to nie było pytanie, kopelitsa, i zawsze możesz używać SQL i robić widoki. – cslotty

0

Możesz bezpośrednio użyć UNION w zapytaniu. Następujące zapytanie zwraca identyfikator znajomych z tabeli PRZYJACIEL.

Np

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 nie. JPQL nie ma "UNION", jak wszystkie odpowiedzi powiedzieć.Jedynym sposobem, że dostawca JPA zaakceptuje to, jeśli zapewnia PRZEDŁUŻENIE PRZEDSIĘBIORSTWA. I czy OP powiedział, z jakiego dostawcy JPA korzysta się? Nie. – DN1