2012-01-10 9 views
13

ho codice come questo:Grails miglior modo per iterare tutti gli ID di una classe di dominio

Book.list().each { 
    // real code actually does something more useful 
    println "My id is " + it.id 
} 

Mi sembra un po 'uno spreco che l'intero oggetto di ogni libro viene caricata solo per accedere al id. C'è un metodo load() in Grails per quando vuoi solo operare sull'ID e mi chiedo se qui c'è un equivalente per caricare tutte le istanze del dominio? Dovrei usare HQL? O dovrei lasciarlo così com'è?

PS: E mi domando se ci dovrebbe essere un'opzione disponibile per la maggior parte dei metodi di Gorm (cercatori ecc) che causano a solo "carico" al posto di "ottenere" la classe di destinazione

risposta

8

È possibile utilizzare HQL per restituire solo i campi necessari

Book.executeQuery("select b.id from Book b");

+0

Direi di utilizzare 'namedQueries' o le query di criteri sono molto meglio di SQL per motivi di leggibilità, specialmente se le query diventano più complesse. –

-2

A meno che l'oggetto libro contiene un sacco di dati, vorrei solo andare con Book.list per renderlo semplice.

Ricordare che il carico () non colpisce effettivamente il database, ma semplicemente costruisce un oggetto con l'ID impostato.

+0

ho appena provato a caricare e sembra che stia colpendo il database se si tenta di accedere a qualsiasi proprietà diversa dall'ID. – aldrin

+0

Sì, questo è il motivo per usare .load invece del solo nuovo Book (id: 2), crea un oggetto proxy che pigro carica l'oggetto all'accesso. –

+0

Concordo sul fatto che se la classe Book non ha molti dati (meno di 100k) l'uso di Book.list() è probabilmente ok. –

9

Una query criteri in combinazione con una proiezione risolve il problema quando si vuole evitare di utilizzare HQL.

def criteria = Book.createCriteria() 
    def result = criteria.list { 
     projections { 
      property 'id' 
     } 
    } 

La registrazione Hibernate SQL mostra che solo gli ID vengono caricati dal database, e non l'intero Libri: select this_.id as y0_ from book this_.

La query di criteri può anche essere aggiunta come named query nella classe dominio Libro, fornendo un facile accesso all'elenco di ID.

5

+1 Per @ risposta di Ruben, ma si potrebbe ridurre fino al semplice

def criteria = Book.withCriteria { 
    projections { 
     property 'id' 
    } 
} 

e ottenere gli stessi risultati!

Problemi correlati