我已經在Grails服務類中編寫了一個標準查詢,我期望一個渴望的聯接被執行,並避免在顯示我的結果時作爲JSON響應延遲加載子對象,或者在我的GSP。查詢按預期執行(在我的DataSource.groovy中設置我的hibernate.show_sql = true,我可以看到查詢),但是當我在我的GSP中檢索關聯時,我可以看到Hibernate正在執行後續查詢,就好像它是在延遲加載協會。我不相信急切的加載實際上正在工作。我不想在我的域類中爲這些關聯設置lazy:false。Grails GORM標準查詢渴望獲取
這是條件查詢:
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)
}
}
}
}
上面的查詢返回沒有任何問題。當我嘗試運行下面的代碼,但是,在我的GSP,我可以看到,Hibernate是爲了發出第二個查詢,就好像它是通過延遲加載取得的resourceAssignments:
<g:each in="${market.resourceAssignments}" var="ra">
</g:each>
我甚至嘗試用無重寫的OpenSessionInViewInterceptor -Op攔截器,通過創建一個空的WebRequestInterceptor並在resources.groovy中設置openSessionInViewInterceptor來使用它。一旦我這樣做了,我得到了一個org.hibernate.LazyInitializationException,它似乎驗證了我在想什麼 - 即使當我指定要急切地獲取這些關聯時,Hibernate或GORM仍然試圖執行第二個查詢。
謝謝伯特。我們將使用HQL,直到bug修復。 Bobby Warner在這個問題上爲Jira提交了一個bug:http://jira.grails.org/browse/GRAILS-9829 –
@DavidMalone提到的JIRA問題已被遷移到GitHub https://github.com/ Grails的/ Grails的核心/問題/ 2764 –