Grails GORM条件查询预取

Grails GORM条件查询预取,grails,gorm,Grails,Gorm,我在Grails服务类中编写了一个条件查询,希望在其中执行一个渴望的连接,并避免在将结果显示为JSON响应或GSP时延迟加载子对象。查询按预期执行(在我的DataSource.groovy中设置my hibernate.show_sql=true,我可以看到查询),但当我在GSP中抓取关联时,我可以看到hibernate正在执行后续查询,就好像它在懒洋洋地加载关联一样。我不相信这种急切的加载确实有效。我不想在我的域类中为这些关联设置lazy:false 这是条件查询: def market =

我在Grails服务类中编写了一个条件查询,希望在其中执行一个渴望的连接,并避免在将结果显示为JSON响应或GSP时延迟加载子对象。查询按预期执行(在我的DataSource.groovy中设置my hibernate.show_sql=true,我可以看到查询),但当我在GSP中抓取关联时,我可以看到hibernate正在执行后续查询,就好像它在懒洋洋地加载关联一样。我不相信这种急切的加载确实有效。我不想在我的域类中为这些关联设置lazy:false

这是条件查询:

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>


我甚至尝试用无操作拦截器覆盖OpenSessionInviewWinterCeptor,方法是创建一个空的WebRequestInterceptor,并在resources.groovy中设置OpenSessionInviewWinterCeptor以使用它。一旦我这样做了,我会得到一个org.hibernate.LazyInitializationException,它似乎验证了我的想法——hibernate或GORM仍然在尝试执行第二个查询,即使我已经指定我想要急切地获取这些关联。

这似乎是一个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]

谢谢你,伯特。我们将使用HQL,直到修复错误为止。Bobby Warner为此问题向感兴趣的人提交了Jira中的一个bug:@davidmonle提到的Jira问题已经迁移到GitHub