2012-01-10 16 views
13

tengo código como este:Griales mejor manera de recorrer todos los identificadores de una clase de dominio

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

Me parece un poco de una pérdida que se carga todo el objeto de cada libro sólo para acceder al carné de identidad. Hay un método load() en Grails para cuando solo quieres operar con el ID y me pregunto si aquí hay un equivalente para cargar todas las instancias del dominio. ¿Debo usar HQL? ¿O debería dejarlo como está?

PD: Me pregunto si debería ser una opción disponible para la mayoría de los métodos GORM (buscadores, etc.) que puedan causar el único "carga" en lugar de "obtener" la clase de destino

Respuesta

8

Puede usar HQL a sólo devuelve los campos que necesite

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

+0

Diría que el uso de 'namedQueries' o las consultas de criterios son mucho mejores que las de SQL para la legibilidad, especialmente a medida que las consultas se hacen más complejas. –

-2

A menos que el objeto libro contiene una gran cantidad de datos, simplemente iría con Book.list para hacerlo simple.

Recuerde que load() no llega a la base de datos, solo construye un objeto con el conjunto de id.

+0

Acabo de intentar cargar y parece estar llegando a la base de datos si intenta acceder a cualquier propiedad que no sea la identificación. – aldrin

+0

Sí, ese es el motivo para usar .load en lugar de solo el nuevo Libro (id: 2), crea un objeto proxy que carga el objeto de forma lenta en el acceso. –

+0

Estoy de acuerdo en que si la clase Book no tiene muchos datos (menos de 100k) Usar Book.list() probablemente sea correcto. –

9

Una consulta de criterios en combinación con una proyección resuelve su problema cuando se quiere evitar el uso de HQL.

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

El registro de SQL de Hibernate muestra que sólo los ID se cargan desde la base de datos, y no todo el Libros: select this_.id as y0_ from book this_.

La consulta de criterios también se puede agregar como named query en la clase de dominio Libro, lo que proporciona un fácil acceso a la lista de ID.

5

1 Para @ respuesta de Ruben, pero se puede acortar hasta simplemente

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

y obtener los mismos resultados!

Cuestiones relacionadas