Left-Join的标准不会加载所有has-many关联

时间:2017-05-29 10:06:21

标签: hibernate grails gorm hibernate-criteria grails-2.5

我们有一个带有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的原因。

1 个答案:

答案 0 :(得分:0)

我还没回家,但我认为你应该使用别名而不是直接使用类变量,就像在this thread中一样

好的,我终于有空余时间来进一步了解它。抱歉,我的第一个回答对您没有帮助。

问题在于GORM将代码转换为SQL的方式不是您期望的

如果您尝试打开SQL登录并将其粘贴到数据库中,那么您就会知道我的意思。查询只返回role.name = Role1的实体,因此这会让你看到" GORM没有加载所有有多个关联"。

快速修复此问题是通过执行user.refresh()再次重新加载实例。

P.S:withNewSession对此事没有任何帮助,所以你也可以从你的代码中删除它