2012-06-09 7 views
15

Qual è l'utilizzo del metodo setResultTransformer nei criteri API? Qualcuno può spiegarlo con un semplice esempio? Leggo i javadoc ma non sono in grado di capirli chiaramente.setResultTransformer in Criteri

saluti,

risposta

13

Il ResultTransformer di default per una query Criteri che non usa setProjections() saranno ROOT_ENTITY.

Se abbiamo Studente in un rapporto ManyToMany al Dipartimento una query potrebbe assomigliare a questo ...

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

Questa query restituirà i duplicati. Ma impostare il ResultTransformer come ...

crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

Ora i risultati saranno distinti quando Hibernate marshalling i risultati. (O devo dire unmarshalls?)

Se non si desidera Sospensione di restituire la query come un List<Student> ma preferisce gestire i risultati come List<Object[]> poi

crit.setResultTransformer(CriteriaSpecification.PROJECTION) 
+1

Dal doc, posso vedere questo termine per ROOT_ALIAS: l'alias che fa riferimento all'entità "root" della query di criteri. In cosa consiste il termine "radice"? Non sono in grado di capire cosa fa la radice in questo caso. Spiega per favore. – user182944

+2

"root" rappresenta qualsiasi classe utilizzata durante la creazione dell'istanza Criteria. Nel mio esempio la radice è Student. Quindi i risultati verranno restituiti da una chiamata a crit.list() come elenco di oggetti Studente. A meno che non si chieda una ResultTransformation come PROJECTION, nel qual caso sarà un elenco di oggetti Object. (Inoltre, sto modificando il mio esempio originale per rimuovere la restrizione in modo che la query restituisca i duplicati.) – carbontax

7

Semplicemente: quando si sta facendo il critera : si desidera che il gruppo di risultati sia in particolare oggetto la si può utilizzare come: es:

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

Employee dovrebbe corrispondere al ResultSet entità.

+0

Questo ha funzionato perfettamente! – normalUser

+0

Funziona come un fascino. Bel consiglio. Grazie – niarb