web-dev-qa-db-fra.com

Critères d'Hibernate Joindre avec 3 tables

Je cherche un critère d'hibernation à suivre:

Dokument.class est mappé sur le rôle roleId

Role.class a un contactId contactPerson

Contact.class Prénom Nom Nom

Je souhaite rechercher First ou LastName dans la classe Contact et récupérer une liste des Dokuments connectés.

J'ai essayé quelque chose comme ça:

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

Je reçois une erreur qui ne résout pas la propriété "LastName" pour la classe "Dokument"

Quelqu'un peut-il expliquer pourquoi les recherches de jointure sont effectuées sur Dokument et non sur toutes les tables jointes? Merci d'avance pour toute l'aide!

59
mahatmanich

Le mode de récupération indique uniquement que l'association doit être extraite. Si vous souhaitez ajouter des restrictions à une entité associée, vous devez créer un alias ou un sous-critère. Je préfère généralement utiliser des alias, mais 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();

Ceci est bien entendu bien expliqué dans le manuel de référence d'Hibernate , et le javadoc pour Criteria contient même des exemples. Lisez la documentation: elle contient de nombreuses informations utiles.

115
JB Nizet