1

我目前正在从事一个 grails 项目,我需要将我的查询结果合并到一个列表中。问题是,在某些情况下,我的查询结果返回相等的值,这会导致错误消息:具有相同标识符值的不同对象已与会话关联

这是我的代码:

List permissions = []
            cmd?.role.each{ role ->
                permissions.add(RolePermission.executeQuery("select distinct rp.permission from RolePermission rp where rp.role = ?",[Role.get(role.toLong())]))
            }

这里的对象角色可能包含两个不同的角色名称,在某些情况下,这些角色名称中存在的权限是相同的。

我将如何修改我的查询以使我只能从结果中获取唯一值?我尝试过使用 distinct,但没有奏效。

请帮忙!

谢谢!

4

1 回答 1

1

我不确定这是否是您想要做的,但根据您的描述,我认为就是这样。以下行的作用是遍历您传入的角色(我假设这些是语法中的角色 ID),并且对于每个角色 ID,它都会为该角色找到一个 RolePermission。找到的每个权限都作为权限列表添加。所以,最后你应该有一个 RolePermissions 列表。

现在,我不明白的是您正在寻找的独特性。您是说一个 Role 可以返回多个 RolePermission 并且您试图确保返回的 RolePermissions 在最终列表中是唯一的?如果是这样,您可以将列表作为一个集合返回(即,将权限作为集合返回)。请让我知道我的理解不足的地方。

def permissions = cmd?.role.collect{RolePermission.findByRole(Role.get(it.toLong()))}
return permissions as Set

或者,您可以使用标准:

def c = RolePermission.createCriteria()
def results = c.listdistinct () {
  roles {
    'in'("id", cmd?.role as List) 
  }
}

我没有通过编译器运行它,但它应该可以工作。

于 2012-07-30T03:43:00.670 回答