2012-01-04 8 views
51

Estoy buscando un criterio de hibernación para conseguir lo siguiente:Criterios de Hibernate se unan a 3 Tablas

Dokument.class se asigna al rol roleId

Role.class tiene una Persona de contacto contactId

Contact.class Nombre Apellido

Quiero buscar Primero o La stName en la clase de contacto y recuperar una lista de Dokuments conectados.

He intentado algo como esto:

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

consigo un error No se pudo resolver la propiedad "Apellido" de la clase "Dokument"

Puede alguien explicar por qué la unión búsquedas en Dokument y no en todas juntas tablas? ¡Gracias de antemano por toda la ayuda!

Respuesta

103

El modo de búsqueda solo indica que se debe recuperar la asociación. Si desea agregar restricciones a una entidad asociada, debe crear un alias o un subcriterio. Yo por lo general prefieren el uso de alias, pero tu caso es distinto:

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(); 

Esto es por supuesto muy bien explicado en el Hibernate reference manual, y el javadoc for Criteria incluso tiene ejemplos. Lea la documentación: tiene mucha información útil.

+3

JB muchas gracias. Sí, he leído las especificaciones, pero para una nueva generación de Hibernate es bastante difícil abarcar toda la jerga de Hibernate. De nuevo GRACIAS FUNCIONA :-) – mahatmanich

+0

por cierto, ¿qué es una asociación, solo una referencia? – mahatmanich

+0

Una asociación es cuando una entidad está vinculada a otra entidad con una asociación OneToOne, OneToMany, ManyToOne o ManyToMany ... –

Cuestiones relacionadas