2011-12-27 6 views
6

Sto cercando di trovare se c'è un modo in Grails di andare a prendere i record completi invece di un join a sinistra.C'è qualche modo in Grails di impaziente di recuperare l'intero record?

Ho due classi con uno a molti mapping. Quando provo a ottenere tutti i record e il rendering come XML, solo gli ID del lato "molti" entrano nel file XML. Esiste comunque l'intero record?

L'esempio che sto usando è come segue:

Ho 3 classi:

utente, Libro e Capitolo

utenti le offerte hanno una relazione molti a molti mappatura e al capitoli è una mappatura da uno a molti. Ho un UserBook di classe che definisce la relazione molti a molti. Ora ho il seguente codice

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 
    } 

Quanto sopra rende un XML con i libri e anche gli ID di capitolo per ogni libro. Quello che volevo era il "libro" qui sopra per contenere anche tutte le informazioni sul capitolo.

Grazie !!

+0

Could fornisci un esempio delle tue lezioni in modo da poter rispondere meglio alla tua domanda? –

+0

Michael, ho fornito l'esempio come suggerito. Grazie!! – iKT

risposta

2

Verificare il docs section 5.3.4. E 'fatto con il fetchMode in te classe di dominio:

static fetchMode = [things:"eager"] 

Tuttavia, se cercate solo gli ID di un oggetto per riempire un file XML (o un altro campo) avrei fatto il check out il projection criteria per migliorare le prestazioni su grandi collezioni.

10

la documentazione dice:

L'impostazione predefinita recuperare strategia utilizzata da Grails è "pigro", il che significa che la collezione sarà pigramente inizializzato. Questo può portare al problema n + 1 se non si presta attenzione. Se avete bisogno di "ansioso" il recupero è possibile usare il DSL ORM o specificare il caricamento diretto come parte di una query

È possibile specificare la strategia di recuperare in classe di dominio, ma secondo me, la migliore strategia per ottenere un 1 rapporto -m è con recuperare o partecipare nella query attraverso metodi aggiunti a Class dominio o criteri, ad esempio:

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

in altri casi è possibile utilizzare i criteri con Hibernate Fetch Modalità:

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

O meglio se conosci HQL, quindi puoi usarlo, perché è possibile indicare il recupero in HQL, ad esempio: def result = DomainClass.findAll ("HQL_Sentence")

Cool uh !!!!

5

Se stai cercando l'output XML per contenere tutte le informazioni capitolo anziché l'ID unico, provare a utilizzare l'XML 'profonda' smistamento (funziona lo stesso per JSON, anche):

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