Search code examples
hibernatejoincriteria

Hibernate Criteria Join with 3 Tables


I am looking for a hibernate criteria to get following:

Dokument.class is mapped to Role roleId

Role.class has a ContactPerson contactId

Contact.class FirstName LastName

I want to search for First or LastName on the Contact class and retrieve a list of Dokuments connected.

I have tried something like this:

session.createCriteria(Dokument.class)
.setFetchMode("role",FetchMode.JOIN)
.setFetchMode("contact",FetchMode.JOIN)
.add(Restrictions.eq("LastName","Test")).list();

I get an error could not resolve property "LastName" for class "Dokument"

Can someone explain why the join searches on Dokument and not on all joined tables?


Solution

  • The fetch mode only says that the association must be fetched. If you want to add restrictions on an associated entity, you must create an alias, or a subcriteria. I generally prefer using aliases, but YMMV:

    Criteria c = session.createCriteria(Dokument.class, "dokument");
    c.createAlias("dokument.role", "role"); // inner join by default
    c.createAlias("role.contact", "contact");
    c.add(Restrictions.eq("contact.lastName", "Test"));
    return c.list();
    

    This is of course well explained in the Hibernate reference manual, and the javadoc for Criteria even has examples. Read the documentation: it has plenty of useful information.