我目前正在开展一个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,但它没有用。
请帮忙!
谢谢!
答案 0 :(得分:1)
我不确定这是不是你想要做的,但是根据你的描述,我认为就是这样。下面这行是迭代你传入的角色(我假设这些是语法中的角色id),并且对于每个角色id,它找到角色的RolePermission。找到的每个权限都作为权限列表添加。所以,最后你应该有一个RolePermissions列表。
现在,我不理解的是你寻找的独特性。你是说一个角色可以返回多个RolePermission,并且你试图确保返回的RolePermissions在最终列表中是唯一的吗?如果是这样,您可以将列表作为集返回(即返回权限为Set)。请让我知道我的理解不足之处。
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)
}
}
我没有通过编译器运行它,但它应该可以工作。