2009-06-04 5 views

risposta

51

Questo è esattamente ciò che le proiezioni sono per. Ecco un esempio:

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("id"), "id") 
     .add(Projections.property("Name"), "Name")) 
    .setResultTransformer(Transformers.aliasToBean(User.class)); 

    List<User> list = cr.list(); 

In realtà, se si guarda la documentazione per "proprietà pigri recupero" che specificamente dicono:


"Un modo diverso (? Meglio) per evitare colonna inutili legge, almeno per le transazioni di sola lettura consiste nell'utilizzare le funzionalità di proiezione delle query HQL o Criteria, evitando così l'elaborazione bytecode del buildtime ed è certamente una soluzione preferita. "


A proposito, c'è una questione connessa che si può anche essere interessati a: Hibernate Query By Example and Projections

+4

È possibile farlo tramite HQL querry? – Antoniossss

1

In genere non si desidera caricare parzialmente le proprietà di un oggetto. Ma se si deve, vede questo:

http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/performance.html#performance-fetching-lazyproperties

Per pianura comportamento segnalazione-come si potrebbe utilizzare le query di entità:

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class); 

http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/querysql.html#d0e17633

4

Sono davvero in ritardo rispondere a questa, ma, è possibile aggiungere un trasformatore risultato personalizzato alla query oggetto come sotto.

Query query = session 
     .getNamedQuery(
       "someNamedQueryWhichISHQL") 
     .setString("cod", "10") 
     .setResultTransformer(new ResultTransformer() { 

      public Object transformTuple(Object[] row, String[] arg1) { 
       User usr = new User(row[0],row[1]); 
       return usr 
      } 

      public List transformList(List arg0) { 

       return arg0; 
      } 
     }); 
return query.list();