Dón*_*nal 4 grails hibernate grails-orm
我的Grails应用程序使用Spring Security的,具有通常的User,UserRole和Role班级.这些类建模的方式是有点不寻常,因为没有hasMany在任何映射User或Role.相反,这些类仅通过引用UserRole.
class UserRole implements Serializable {
User user
Role role
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,出于性能原因,这种关系已经建模,特别是为了减少N + 1查询的可能性.
在我的应用程序的一部分中,我需要加载所有用户及其角色.意识到上述问题,我试着这样做:
def usersByRole = UserRole.createCriteria().list {
fetchMode("user", FetchMode.JOIN)
fetchMode("role", FetchMode.JOIN)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试访问 User objects
usersByRole.each { it.user }
Run Code Online (Sandbox Code Playgroud)
发出一个单独的查询来从User表中检索数据,因此我遇到了我试图避免的问题.我也尝试了以下,但它遇到了同样的问题.
def usersByRole = UserRole.createCriteria().list {
fetchMode("user", FetchMode.SELECT)
fetchMode("role", FetchMode.SELECT)
}
Run Code Online (Sandbox Code Playgroud)
我应该承认,我不是之间的差别完全清楚FetchMode.JOIN和FetchMode.SELECT,因此,如果任何人都可以把我直上,它会受到赞赏.
我尝试了几种组合,但结果相同 - 如果你看一下生成的SQL,原始查询中没有连接,所以它必须做额外的查询才能加载用户和角色.
其他人在这个域类中遇到了问题 - 看起来GORM中存在一个错误,其中包含由域类组成的复合键,或者类似的东西.通常人们对HQL的解决方法感到满意,并且运气好,所以你会:)
def usersByRole = UserRole.executeQuery(
'select ur from UserRole ur ' +
'left join fetch ur.user ' +
'left join fetch ur.role')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |