2013-09-23 35 views
9

Có thể truy vấn "UNION" trong JPA và thậm chí "Trình tạo tiêu chí" không?UNION to JPA Query

Tôi đang tìm kiếm các ví dụ, nhưng cho đến nay tôi không nhận được kết quả nào.

Có ai có ví dụ nào về cách sử dụng không?

Hoặc điều đó có được với sql gốc không?

+0

thể trùng lặp của [Liên minh Tất cả và Sum với JPA CriteriaBuilder] (http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder) – danizmax

Trả lời

15

SQL hỗ trợ UNION, nhưng JPA 2.0 JPQL thì không. Hầu hết các công đoàn có thể được thực hiện trong điều khoản của gia nhập, nhưng một số có thể không, và một số là khó khăn hơn để thể hiện bằng cách sử dụng tham gia.

Nhưng, EclipseLink hỗ trợ UNION. Vì vậy, hãy sử dụng EclipseLink thay vì JPA.

+1

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query/JPQL#UNION liên kết đến các tài liệu EL với các ví dụ – Chris

15

Tùy theo trường hợp, người ta có thể sử dụng các truy vấn phụ, một cái gì đó như:

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

Làm thế nào để xử lý tình huống nếu trong truy vấn phụ có hơn 1000 kết quả? – user613114

+0

Đối với MS SQL, trên 2000 thực tế, không thay đổi thực tế nó sẽ không hoạt động. Bạn có thể tìm nạp tất cả các id đó và sau đó phân vùng danh sách kết quả theo giới hạn bạn muốn đặt và sau đó thực hiện truy vấn cho tất cả các danh sách con và kết quả tham gia. Nó không phải là xấu xem xét cách JPA hoạt động nhưng sau đó, như mọi khi, nó phụ thuộc vào trường hợp sử dụng của bạn. – szczepanpp

+0

Thậm chí không đề cập đến việc sử dụng UNION nhất định là tránh OR (khi điều chỉnh hiệu năng SQL). Cá nhân tôi có một biểu hiện phụ với HOẶC những gì là rất chậm. Sau khi viết lại để sử dụng công đoàn nó trở thành cường độ nhanh hơn. Bây giờ tôi phải tìm một giải pháp để xây dựng nó với CriteriaBuilder: ( – takacsot

4

Một điều chỉ nói đến tâm trí của tôi (tìm kiếm cho cùng một vấn đề chính xác):

Thực hiện hai truy vấn JPA khác nhau trên cùng một ánh xạ thực thể và chỉ cần thêm các đối tượng của kết quả thứ hai vào danh sách (hoặc đặt để tránh trùng lặp) của kết quả đầu tiên.

Bằng cách đó bạn có được hiệu ứng tương tự như với UNION, sự khác biệt là bạn sử dụng hai câu lệnh SQL thay vì một câu lệnh. Nhưng trên thực tế, tôi hy vọng rằng để thực hiện tốt như phát hành một tuyên bố UNION.

+1

thiên tài !!! nên được coi là câu trả lời tốt nhất cho đến khi JPQL hỗ trợ các công đoàn –

+0

Vâng, đây là một trong những cách giải quyết rõ ràng, nhưng tôi cũng muốn sắp xếp kết quả tất cả lại với nhau và tôi thích làm điều này bằng sql hơn là trong java – kopelitsa

+0

Nhưng đó không phải là câu hỏi, kopelitsa, và bạn luôn có thể sử dụng SQL và tạo ra các khung nhìn ( – cslotty

0

Bạn có thể trực tiếp sử dụng UNION trong truy vấn của mình. Truy vấn sau trả về id của bạn bè từ bảng FRIENDSHIP.

Ví dụ:

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 không có "UNION" vì tất cả các câu trả lời đều cho bạn biết. Cách duy nhất để nhà cung cấp JPA chấp nhận đó là nếu nó cung cấp VENDOR EXTENSION. Và OP có nói nhà cung cấp JPA nào được sử dụng không? Không. – DN1