Search code examples
hibernatecriteria

Hibernate: Criteria with many-to-many join table?


Consider the following two relations:

@Entity class Foo {
    @Id id;

    @ManyToMany
    @JoinTable(name = "ATag", 
         joinColumns = @JoinColumn(name = "foo_id"),
         inverseJoinColumns = @JoinColumn(name = "tag_id"))
    Set<Tag> tags;
}

@Entity class Tag {
    @Id Long id;
    String name;
}

There is no corresponding entity class for the join table ATag. Now, I want to get all Foo instances with Tag named 'tag1'. Is it possible using only Criteria?

A subquery may be helpful. However, I can't create DetachedCriteria for class ATag.class which doesn't existed.


Solution

  • Just dealt with this exact issue. You're thinking in tables, not objects. Just reference tags.name and let Hibernate take care of the rest:

    Criteria crit = session.createCriteria(Foo.class);
    crit.createAlias("tags", "tagsAlias");
    crit.add(Restrictions.eq("tagsAlias.name", someValue);
    

    If you watch the SQL Hibernate spits out, you'll see it uses the join table.