我在Grails服务类中编写了一个条件查询,我期望执行一个急切的连接,并避免在以JSON响应或我的GSP显示结果时延迟加载子对象.查询按预期执行(在我的DataSource.groovy中设置我的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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的查询返回没有任何问题.但是,当我尝试运行以下代码时,在我的GSP中,我可以看到Hibernate正在发出第二个查询,好像它是懒惰地获取resourceAssignments:
<g:each in="${market.resourceAssignments}" var="ra">
</g:each>
Run Code Online (Sandbox Code Playgroud)
我甚至尝试用No-Op拦截器覆盖OpenSessionInViewInterceptor,方法是创建一个空的WebRequestInterceptor并在resources.groovy中设置openSessionInViewInterceptor来使用它.一旦我这样做,我得到一个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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7024 次 |
| 最近记录: |