2009-09-24 13 views
7

Tengo esta clase mapeada como una entidad, vamos a llamarla Persona. La persona tiene una relación incrustada/componente con Dirección. Tengo problemas para usar un Criterio que devolvería los objetos de Dirección. He intentado esto:Recuperar emebedded o componente usando los criterios de Hibernate api

Criteria.createCriteria(Address.class) 

Qué no funciona. Supongo que necesito pasar por la entidad, pero ¿entonces necesitaría algún tipo de proyección?

Criteria.createCriteria(Person.class).<<what goes here???>> 

Sugerencias?

Respuesta

6

La duración de los componentes está controlada por su propietario; NO se consideran asociaciones. Por lo tanto, no puede recuperar el componente por sí mismo de una consulta. Sin embargo, puede usarlo en los criterios.

Asumiendo que su clase "Dirección" se asigna como "dirección" dentro "Persona", que podría hacer algo como:

Criteria.createCriteria(Person.class) 
.add(Restrictions.eq("address.street", street)); 
+0

Ok, pero ¿cómo es que puedo hacer un HQL y recuperar la dirección directa? ¿Por qué no se aplica lo mismo a las consultas? – Konstantin

+0

Porque HQL tiene capacidades que la API de Criteria no tiene. Ahora, si realmente desea devolver su dirección a cualquier costo, puede crear una lista de proyección para los criterios basados ​​en la persona que contendría todas las propiedades de la dirección (y nada más) y aplicar 'AliasToBeanResultTransformer' a un resultado. Pero esto es un gran dolor de cabeza y nada que mostrar; Seleccionaría Persona completa en su lugar y extraería la Dirección (si eso es lo que necesita) en código Java. O ve con HQL. – ChssPly76

0

Esto es cómo se puede recuperar o consultar la propiedad del objeto incrustado en hibernación.

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
       Parent.class,"parent"); 
criteria.createAlias("embeddedObjectFieldName", "parent.embeddedObjectFieldName"); 

criteria.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("parent.propertyOne")) 
       .add(Projections.max("embeddedObjectFieldName.embeddedobjectproperty"))); 

Esperanza anterior aclara

Cuestiones relacionadas