2

我们有一个带有hibernate4:4.3.8.1插件的 grails 2.5.5 应用程序。

当我们使用条件 API 和左连接查询具有 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
}

但是当使用左连接查询时,用户结果只包含查询的“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在这个例子中使用的原因。

4

1 回答 1

0

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


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

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

如果您尝试打开 SQL 日志并将其复制粘贴到您的数据库中,那么您就会明白我的意思。该查询仅返回 role.name = Role1 的实体,因此这会导致您看到“GORM 不会加载所有 has-many 关联”。

对此的快速解决方法是通过执行 user.refresh() 再次重新加载实例。

PS:withNewSession 在这件事上对你没有任何帮助,所以你不妨从你的代码中删除它

于 2017-05-30T07:52:39.347 回答