2013-02-07 44 views
5

我已經在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仍然試圖執行第二個查詢。

回答

5

它似乎是一個帶有標準查詢的Grails錯誤。這是一個HQL查詢,雖然工作:

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

謝謝伯特。我們將使用HQL,直到bug修復。 Bobby Warner在這個問題上爲Jira提交了一個bug:http://jira.grails.org/browse/GRAILS-9829 –

+0

@DavidMalone提到的JIRA問題已被遷移到GitHub https://github.com/ Grails的/ Grails的核心/問題/ 2764 –