2013-02-07 11 views
5

私は熱心な結合が実行されると期待しているGrailsサービスクラスに基準クエリを書きました。結果をJSONレスポンスまたはmy GSP。クエリは期待通りに実行されました(DataSource.groovyで私のhibernate.show_sql = trueを設定しましたが、私はクエリを見ることができます)。しかし、私のGSPで関連付けをクロールすると、Hibernateは遅延ロード協会。熱心なロードが実際に働いていると私は確信していません。私は怠け者に設定したくありません:これらの関連の私のドメインクラス内ではfalseです。Grails GORM Criteria Eager Fetchをクエリ

これは、基準クエリです:

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) 
      } 
     } 
    }   
} 

上記のクエリが問題なく返されます。私もないとOpenSessionInViewInterceptorを上書きしようとした

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

:私は私のGSPに、しかし、次のコードを実行しようとすると、私はそれを遅延resourceAssignmentsを取得しているかのように、Hibernateは2番目のクエリを発行していることがわかります空のWebRequestInterceptorを作成し、それを使用するためにresources.groovyのopenSessionInViewInterceptorを設定することによって、私がこれをしたら、org.hibernate.LazyInitializationExceptionを取得しました.LazyInitializationExceptionは、私がこれらの関連付けを熱心に取り出すことを指定したとしても、HibernateまたはGORMがまだ2番目のクエリを実行しようとしていることを確認しているようです。

答えて

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

ありがとうBurt。バグが修正されるまでHQLを使用します。ボビー・ワーナー氏は、興味のある方々のためにこの問題についてJiraのバグを提出しました:http://jira.grails.org/browse/GRAILS-9829 –

+0

@DavidMaloneで言及されたJIRAの問題は、GitHub https://github.com/に移行されました。 grails/grails-core/issues/2764 –

関連する問題