2013-02-07 8 views
5

Ho scritto una query di criteri in una classe di servizio Grails in cui prevedo di eseguire un join eager per evitare il caricamento lento di oggetti figlio durante la visualizzazione dei risultati come risposta JSON o nella mia GSP. La query è stata eseguita come previsto (impostazione mia hibernate.show_sql = true nel mio DataSource.groovy Posso vedere la query), ma quando eseguo la scansione dell'associazione nel mio SPG, posso vedere che Hibernate sta eseguendo query successive come se stesse caricando pigramente le associazioni. Non sono convinto che il caricamento ansioso funzioni effettivamente. Non voglio impostare pigro: falso all'interno della mia classe di dominio per queste associazioni.Grails GORM Criteria Query Eager Fetching

Questa è la query criteri:

def market = Market.withCriteria(uniqueResult:true){ 
    idEq(marketId) 
    fetchMode 'resourceAssignments', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.role', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.user', FetchMode.JOIN 
    resourceAssignments{ 
     userRole{ 
      role{ 
       'in'('name', roleNames) 
      } 
     } 
    }   
} 

la query restituisce sopra senza problemi. Quando si tenta di eseguire il codice riportato di seguito, anche se, a mio SPG, posso vedere che Hibernate emette una seconda query come se fosse pigramente il recupero dei resourceAssignments:

<g:each in="${market.resourceAssignments}" var="ra"> 
</g:each> 

Ho anche provato l'override del OpenSessionInViewInterceptor con un No -Op interceptor, creando un oggetto WebRequestInterceptor vuoto e impostando openSessionInViewInterceptor in resources.groovy per usarlo. Una volta fatto ciò, ottengo un org.hibernate.LazyInitializationException che sembra verificare cosa stavo pensando - che Hibernate o GORM sta ancora tentando di eseguire una seconda query anche quando ho specificato che voglio recuperare con entusiasmo queste associazioni.

risposta

5

Sembra un bug di Grails con query di criteri. Ecco una query HQL che funziona però:

def market = Market.executeQuery(
    'select m from Market m ' + 
    'inner join fetch m.resourceAssignments as ra ' + 
    'inner join fetch ra.userRole as ur ' + 
    'inner join fetch ur.role as role ' + 
    'inner join fetch ur.user as user ' + 
    'where m.id=:marketId and role.name in (:roleNames)', 
    [marketId: marketId, roleNames: roleNames], [max: 1])[0] 
+1

Grazie Burt. Useremo HQL fino a quando il bug non verrà risolto. Bobby Warner ha inviato un bug a Jira per questo problema per gli interessati: http://jira.grails.org/browse/GRAILS-9829 –

+0

Il problema JIRA menzionato da @DavidMalone è stato migrato a GitHub https://github.com/ Grails/Grails processori/temi/2764 –