2012-01-04 18 views
51

Cerco un criterio di sospensione per ottenere seguente:Hibernate criteri di join con 3 tavoli

Dokument.class è mappata Ruolo ID ruolo

Role.class ha un ContactPerson ContactID

Contact.class FirstName LastName

Voglio cercare First o La stName nella classe Contact e recuperare un elenco di Dokuments connessi.

Ho provato qualcosa di simile:

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

ottengo un errore non poteva risolvere proprietà "Cognome" per la classe "Dokument"

Qualcuno può spiegare perché il join ricerche sul Dokument e non su tutti i tavoli uniti? Grazie in anticipo per tutto l'aiuto!

risposta

103

La modalità di recupero indica solo che l'associazione deve essere recuperata. Se si desidera aggiungere restrizioni a un'entità associata, è necessario creare un alias o una sottocriteria. Io in genere preferisce usare pseudonimi, ma 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(); 

Questo è naturalmente ben spiegato nel Hibernate reference manual, e il javadoc for Criteria ha anche esempi. Leggi la documentazione: contiene molte informazioni utili.

+3

JB grazie mille. Sì, ho letto le specifiche, ma per un neofita di Hibernate è abbastanza difficile avvolgere la propria mente su tutto il gergo di Hibernate. ANCORA GRAZIE FUNZIONA :-) – mahatmanich

+0

btw cos'è un'associazione, solo qualche riferimento? – mahatmanich

+0

Un'associazione è quando un'entità è collegata a un'altra entità con un'associazione OneToOne, OneToMany, ManyToOne o ManyToMany .... –

Problemi correlati