我们有一个带有hibernate4:4.3.8.1
插件的grails 2.5.5应用程序。
当我们使用criteria-api和left-join查询具有has-many关系的域时,gorm不会加载所有has-many关联。
示例:
class Role {
String name
}
class User {
String name
static hasMany = [roles: Role]
}
测试数据:
def role1 = new Role(name: "Role1").save()
def role2 = new Role(name: "Role2").save()
def user = new User(name: "User")
user.addToRoles(role1)
user.addToRoles(role2)
user.save()
当我们使用内部联接查询结果时,它按预期工作并加载用户的所有角色:
User.withNewSession {
def user = User.withCriteria({
roles {
eq "name", "Role1"
}
}).first()
assert user.roles.size() == 2
}
但是当使用left-join查询时,用户结果只包含查询的“Role1”。 “角色2”未加载。
User.withNewSession {
def user = User.withCriteria({
roles(CriteriaSpecification.LEFT_JOIN) {
eq "name", "Role1"
}
}).first()
assert user.roles.size() == 2 //This breaks! Only Role1 is loaded.
}
有什么想法可以解决这个问题吗?
注意:只有在未正确加载角色之前,此代码才会中断。这就是我在这个例子中使用withNewSession
的原因。
答案 0 :(得分:0)
我还没回家,但我认为你应该使用别名而不是直接使用类变量,就像在this thread中一样
好的,我终于有空余时间来进一步了解它。抱歉,我的第一个回答对您没有帮助。
问题在于GORM将代码转换为SQL的方式不是您期望的。
如果您尝试打开SQL登录并将其粘贴到数据库中,那么您就会知道我的意思。查询只返回role.name = Role1的实体,因此这会让你看到" GORM没有加载所有有多个关联"。
快速修复此问题是通过执行user.refresh()再次重新加载实例。
P.S:withNewSession对此事没有任何帮助,所以你也可以从你的代码中删除它