2011-01-09 3 views
12

Я пишу запрос JPQL, и у меня есть следующий сценарий. У меня есть объект Question, который содержит список тегов. Я хотел бы выбрать все Вопросы, содержащие данный Список тегов. Как мне это сделать с JPA?Выбор, где объект содержит список, который является подмножеством другого списка

Я хотел бы сделать что-то вроде SELECT, х Вопроса х ГДЕ x.tags «содержит все»: теги

ответ

3

[Этот поиск ANY не ALL; см. другие правильные ответы.]

Вы можете установить список в качестве параметра.

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

Также попробуйте использовать (: теги), так как это зависит от используемой реализации JPA.

+1

Я проверить это в короткое время. Я знаю, что это работает, если я проверяю, есть ли один тег в списке тегов. Но теперь моя ситуация включает тестирование, если список тегов является подмножеством другого списка тегов. – joshua

+0

Каково было решение? – Phil

+0

Да. это сработало. – joshua

5

Попробуйте так:

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

Этот ответ сработал для меня с использованием MySQL. @ nayan-wadekar ответ давал sql-грамматические исключения. – malloc4k

4

Nayans решение does'nt для меня работа. Он выбирает каждый «х», который соответствует первой (или любой?) Записи данной коллекции: теги ». Если это действительно сработало для вас, вы должны снова проверить свое приложение;) Возможно, это зависит от JPA - я не знаю.

Совет: Попробуйте Krzysztofs решение или использовать мину:

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

Невозможно обмануть проверку тегов, требуя двух тегов. и вопрос имеет два, но только соответствующий? – Amalgovinus

Смежные вопросы