Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting where an entity contains a list thats a subset of another list

Tags:

jpa

jpql

I am writing a JPQL query and i have the following scenario. I have a Question entity which contains a list of Tags. I would like to select all Questions that contains a given List of tags. How do i do this with JPA?

I would like to do something like SELECT x FROM Question x WHERE x.tags 'contains all' :tags

like image 986
joshua Avatar asked Jan 09 '11 09:01

joshua


3 Answers

Nayans solution does'nt work for me. Its selecting every 'x' which matches the first (or any?) entry of the given collection ':tags'. If this really worked for you, you should test you application again ;) might be JPA dependend - I don't know.

Tip: Try Krzysztofs solution or use mine:

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 ;)
    )
)
like image 78
zyexal Avatar answered Nov 12 '22 13:11

zyexal


Try like this:

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
like image 24
Krzysztof Kaczmarek Avatar answered Nov 12 '22 14:11

Krzysztof Kaczmarek


[This searches for ANY not ALL; please refer other correct answers.]

You can set list as a parameter.

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

Also try using (:tags), as it depends on the JPA implementation you are using.

like image 3
Nayan Wadekar Avatar answered Nov 12 '22 13:11

Nayan Wadekar