2011-01-09 43 views
12

Tôi đang viết truy vấn JPQL và tôi có kịch bản sau đây. Tôi có một thực thể Câu hỏi chứa danh sách các Thẻ. Tôi muốn chọn tất cả các Câu hỏi có chứa Danh sách thẻ nhất định. Làm thế nào để tôi làm điều này với JPA?Chọn nơi thực thể chứa danh sách có tập hợp con của một danh sách khác

Tôi muốn làm điều gì đó như SELECT x TỪ Câu hỏi x ĐÂU x.tags 'chứa tất cả': Thẻ

Trả lời

3

[này tìm kiếm cho bất kỳ không TẤT CẢ; vui lòng tham khảo các câu trả lời đúng khác.]

Bạn có thể đặt danh sách làm thông số.

SELECT x FROM Question x WHERE x.tags IN :tags 

Cũng thử sử dụng (: thẻ), vì nó phụ thuộc vào triển khai JPA bạn đang sử dụng.

+1

tôi sẽ kiểm tra điều này trong một thời gian ngắn. Tôi biết nó hoạt động nếu tôi kiểm tra xem một thẻ có nằm trong danh sách các thẻ hay không. Nhưng bây giờ tình hình của tôi liên quan đến việc kiểm tra nếu một danh sách các thẻ là một tập hợp con của một danh sách các thẻ khác. – joshua

+0

Giải pháp là gì? – Phil

+0

Yea. đã hoạt động. – joshua

5

Hãy thử như thế này:

select distinct q from Question q join q.tags as t 
where t.name in (:tags) 
group by q.id, q.author, q.title, q.content,q.postedAt 
having count(t.id) = :size 
+0

Câu trả lời này làm việc cho tôi bằng cách sử dụng MySQL. @ nayan-wadekar câu trả lời đã được đưa ra ngoại lệ ngữ pháp sql. – malloc4k

4

Nayans giải pháp làm việc Does'nt cho tôi. Chọn mỗi 'x' của nó khớp với mục nhập đầu tiên (hoặc bất kỳ?) Nào của tập hợp ': thẻ' đã cho. Nếu điều này thực sự hiệu quả với bạn, bạn nên kiểm tra lại ứng dụng của bạn;) có thể phụ thuộc vào JPA - Tôi không biết.

Mẹo: Hãy thử Krzysztofs giải pháp hoặc sử dụng tôi:

SELECT x FROM Question x 
WHERE x IN (
    SELECT y FROM Question y 
    INNER JOIN y.tags yt 
    WHERE yt IN (
     :tags 
    ) 
    GROUP BY y 
    HAVING COUNT(DISTINCT yt) = (
     :tagsSize // should be clear ;) 
    ) 
) 
+0

Không thể đánh dấu thẻ bị đánh lừa bởi bạn yêu cầu hai thẻ. và câu hỏi có hai nhưng chỉ phù hợp với một câu hỏi? – Amalgovinus

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