Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate many-to-many: Criteria for looking up all class A which contains class B

Tags:

hibernate

I have 2 classes which have many to many relationship. I take the 'Question' and 'Tag' as an example to make the case more understandable.

For each question, you have several tags. The same as for tag.

What I would like to do is to get all questions (and their corresponding tags) if the question contain a tag says "hibernate".

I can at most do it with a SQLQuery in the many-to-many table and return a list of the question ID. Then use a criteria with a restrictions.in and grab all questions. But it's too clumsy and I bet there is a better way of doing it, is there?

like image 446
Yau Leung Avatar asked Oct 27 '10 10:10

Yau Leung


1 Answers

Essentially, you need to create an alias and use the alias to query the child collection like so:

List questions = sess.createCriteria(Question.class)
    .createAlias("Tags", "t")
    .add( Restrictions.eq("t.name", "hibernate") )
    .list();

I'm assuming you don't actually have a class that represents the "bridge" table to the tags table in this scenario, otherwise you'd need to create 2 aliases eg:

List questions = sess.createCriteria(Question.class)
        .createAlias("QuestionTag", "qt")            
        .createAlias("qt.Tags", "t")
        .add( Restrictions.eq("t.name", "hibernate") )
        .list();

You can find out more from the docs:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querycriteria.html#querycriteria-associations

like image 59
lomaxx Avatar answered Oct 09 '22 13:10

lomaxx