2012-06-09 15 views
15

¿Cuál es el uso del método setResultTransformer en la API de criterios? ¿Alguien puede explicar esto con un simple ejemplo? Leo los javadocs pero no puedo entenderlos claramente.setResultTransformer en el Criterio

Saludos,

Respuesta

13

El ResultTransformer por defecto para una consulta Criterios que no utiliza setProjections() serán ROOT_ENTITY.

Si tenemos Estudiante en una relación ManyToMany al Departamento una consulta podría tener este aspecto ...

Session session = (Session) getEntityManager().getDelegate(); 
    Criteria crit = session.createCriteria(Student.class) 
     .createAlias('departments', 'department'); 

Esta consulta devolverá duplicados. Pero establecer la ResultTransformer como ...

crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

Ahora los resultados serán distintas cuando Hibernate marshalls los resultados. (O lo que quiero decir unmarshalls?)

Si no desea que Hibernate para devolver la consulta como un List<Student> pero prefiere para manejar los resultados como un List<Object[]> continuación

crit.setResultTransformer(CriteriaSpecification.PROJECTION) 
+1

Del doc, puedo ver este término para ROOT_ALIAS: El alias que se refiere a la entidad "raíz" de la consulta de criterios. ¿Qué significa el término "raíz" en este caso? No soy capaz de entender a qué se refiere root en este caso. Por favor explique. – user182944

+2

"raíz" significa la clase que usaste al crear tu instancia de Criteria. En mi ejemplo, la raíz es Estudiante. De modo que los resultados serán devueltos por una llamada a crit.list() como una lista de objetos de estudiante. A menos que solicite una Transformación de resultado como PROYECCIÓN, en cuyo caso será una Lista de objetos. (Además, estoy editando mi ejemplo original para eliminar la Restricción para que la consulta devuelva duplicados). – carbontax

7

Simplemente: cuando usted está haciendo la critera : desea que el conjunto de resultados a ser objeto en particular, la que se puede utilizar como: por ejemplo:

.setResultTransformer(Transformers.aliasToBean(Employee.class)); 

Employee debe coincidir con el ResultSet Entidad.

+0

¡Esto funcionó a la perfección! – normalUser

+0

Funciona como un encanto. Buen consejo. Gracias – niarb

Cuestiones relacionadas