2011-12-27 20 views
6

Estoy tratando de encontrar si hay alguna forma en Grails de obtener registros completos ansiosos en lugar de una combinación de la izquierda.¿Hay alguna forma en Grails de obtener todo el registro?

Tengo dos clases con asignación de uno a muchos. Cuando intento obtener todos los registros y representarlos como XML, solo los identificadores del lado "muchos" entran en el archivo XML. ¿Hay alguna forma de obtener todos los registros?

El ejemplo que estoy usando es el siguiente:

tengo 3 clases:

usuario, libro y el capítulo

Usuarios y libro tienen un muchos a muchos mapas y libro de capítulos está un mapeo de uno a muchos. Tengo un UserBook de la clase que define la relación de muchos a muchos. Ahora tengo el siguiente código

user = User.findByUserId(params.userid.toString()) 
     def books = user.getAllBooks() 
     render books as XML 

Set<Book>getAllBooks() { 
     UserBook.findAllByUser(this).collect {it.book} as Set 
    } 

Lo anterior representa un XML con los libros y también los ID de capítulo para cada libro. Lo que quería era que los "libros" anteriores también contengan toda la información del capítulo.

Gracias!

+0

Podría usted proporciona un ejemplo de sus clases para que podamos responder mejor su pregunta? –

+0

Michael, he proporcionado el ejemplo que sugirió. ¡¡Gracias!! – iKT

Respuesta

2

Echa un vistazo a docs section 5.3.4. Se hace uso de la fetchMode en que la clase de dominio:

static fetchMode = [things:"eager"] 

Sin embargo, si lo que buscas es sólo la ID de un objeto para llenar un archivo XML (u otro campo) Me gustaría revisar la projection criteria para un mejor rendimiento en grandes colecciones.

10

La documentación dice:

El valor por defecto traiga estrategia utilizada por Grails es "perezoso", lo que significa que la colección será inicializado con pereza. Esto puede conducir al problema n + 1 si no tiene cuidado. Si necesita "ansiosos" ir a buscar se puede utilizar el DSL ORM o especificar ansiosos ir a buscar como parte de una consulta

se puede especificar la estrategia de recuperación en la clase de dominio, pero en mi humilde opinión, la mejor estrategia para obtener un 1 -m es la relación con ir a buscar o participar en la consulta a través de métodos añadidos a la clase de dominio o criterios, por ejemplo:

// You have a Book with many Authors, then you specify the fetching strategy with eager 
def results = Book.list(fetch:[authors:"eager"]) 

en otro caso, puede utilizar criterios con Hibernate Fetch Mode:

import org.hibernate.FetchMode as FM 
… 
def results = c.list { 
    maxResults(10) 
    firstResult(50) 
    fetchMode("aRelationship", FM.JOIN) 
} 

O mejor si conoce HQL, entonces puede usarlo, porque es posible indicar la obtención en HQL, por ejemplo: def result = DomainClass.findAll ("HQL_Sentence")

Cool uh !!!!

5

Si usted está buscando la salida XML que contiene la información capítulo completo en lugar del ID única, intente utilizar el XML 'profundo' marshalling (funciona igual para JSON, también):

XML.use('deep') { 
    render books as XML 
} 
Cuestiones relacionadas