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?
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?
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.
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION link do dokumentów EL z przykładami – Chris
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'
)
Jak obsługiwać scenariusz, jeśli w podkwerendy ma więcej niż 1000 wyników? – user613114
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
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
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.
powinno być najlepszą odpowiedzią, dopóki JPQL nie będzie wspierało związków –
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
Ale to nie było pytanie, kopelitsa, i zawsze możesz używać SQL i robić widoki. – cslotty
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();
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
możliwe duplikat [Unii wszystkich i Sum z JPA CriteriaBuilder] (http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder) – danizmax