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.
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 –
Il problema JIRA menzionato da @DavidMalone è stato migrato a GitHub https://github.com/ Grails/Grails processori/temi/2764 –