2013-01-15 40 views
7

Tôi muốn tìm các mục có chứa tất cả các thẻ đã cho trong thẻ của chúng được đặt.Tìm các mục có tập hợp chứa tất cả các phần tử của một tập hợp nhất định với jpql

Dưới đây là các lớp học đơn giản:

@Entity 
class Item { 
    @ManyToMany 
    var tags: java.util.Set[Tag] = new java.util.HashSet[Tag]() 
} 

@Entity 
class Tag { 
    @ManyToMany(mappedBy="tags") 
    var items: java.util.Set[Item] = new java.util.HashSet[Item] 
} 

Nếu tôi thử nó như thế này

select distinct i 
from Item i join i.tags t 
where t in (:tags) 

tôi nhận được vật phẩm chứa bất kỳ các thẻ nhất định. Điều đó không đáng ngạc nhiên, nhưng tôi muốn Các mục có chứa tất cả của các thẻ đã cho. Vì vậy, tôi thử theo cách khác xung quanh:

select distinct i 
from Item i join i.tags t 
where (:tags) in t 

Tôi nhận được thông báo lỗi org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions. Nó hoạt động nếu tags chỉ chứa một thẻ duy nhất, nhưng nó không thành công với nhiều hơn thế.

Làm cách nào để diễn đạt điều này trong JPQL?

+0

Vì tôi nghĩ bạn không thể so sánh được với các mảng khác trong chế độ ngủ đông. Tôi nghĩ bạn phải viết lại mã truy vấn sql. –

+0

Truy vấn truy vấn = session.createQuery ("từ Cổ phiếu trong đó stockId trong (: mã)"); query.setParameterList ("mã", idList); –

+0

Tôi đánh giá cao việc bạn đã thể hiện trong câu hỏi của mình về cách bạn nhận được các mục chứa bất kỳ thẻ nào đã cho! Đây là những gì tôi đang tìm kiếm. Tôi cũng có thể xác nhận nó hoạt động với '@ ElementCollection'. –

Trả lời

8

Bí quyết là sử dụng một số lượng:

select i from Item i join i.tags t 
where t in :tags group by i.id having count(i.id) = :tagCount 
+0

Đây là một trong những điều sẽ đưa bạn mãi mãi để xem nó, và sau đó khi bạn làm, bạn không thể tin rằng bạn không nhìn thấy nó tất cả cùng –

2

Tôi chỉ có vấn đề tương tự như bạn. Tôi đã sử dụng quảng cáo reductio absurdum:

select distinct i from Item i where i not in (select i2 from Item i2 join i2.tags t where t not in :tags) 
+0

Tôi thích phương pháp này vì tôi đã có một truy vấn trả lại những gì tôi đã làm Không muốn, nhưng tôi sẽ cần phải thêm một số điều kiện để lựa chọn bên trong để cho các kết quả truy vấn phụ vẫn còn nhỏ. Thay vào đó, tôi đã sử dụng phương pháp tính được mô tả tại đây http://stackoverflow.com/a/21645545/429896 mà không yêu cầu thêm nội dung sau "nhóm theo". – HypeXR

Các vấn đề liên quan