2012-07-30 46 views
1

我目前正在研究grails项目,现在我需要将列表中的查询结果合并到一起。问题是,存在这样的情况,我的查询结果返回相等的值,这会导致的错误消息:具有相同标识符值A不同的对象已经与会话如何检查列表是否在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())])) 
      } 

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

我该如何修改我的查询,使得我只能从结果中获取唯一值?我试过使用不同的,但它没有工作。

请帮忙!

谢谢!

回答

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) 
    } 
} 

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

+0

方案是这样的:其中的角色对象可以有多个值(ROLE_ADMIN,ROLE_SYSTEM_MANAGER),现在ROLE_ADMIN可能包含ROLE_SYSTEM_MANAGER中可能存在的权限。在我的权限列表中,我需要获得ROLE_ADMIN和ROLE_SYSTEM_MANAGER的权限。用我现有的hsql,我得到了这两个角色包含的所有权限。我想要做的只是从角色获得DISTINCT/UNIQUE权限。例如,ROLE_ADMIN和ROLE_SYSTEM_MANAGER具有READ_ANNOUNCEMENT权限,我只需要获取这些权限的一个实例。 – chemilleX3 2012-07-30 04:13:18

+0

好的,然后我的答案立场。 '将权限返回为Set'会导致你的列表被转换为一个Set,这保证了唯一性。您可能需要在RolePermissions上实现Equals和Hash,以确保正确比较它们。如果您使用IntelliJ或Eclipse,则可以自动创建应该可以使用的Equals/Hash方法。我也想补充一点,这不是唯一的解决方案。您可以创建一个用于RolePermission的标准并调用criteria.listdistinct()。我会在一分钟内用标准解决方案发布我的答案更新。 – 2012-07-30 04:33:06

+0

非常感谢你迈克尔..要考虑这个..稍后如果它会工作,更新你:) – chemilleX3 2012-07-30 05:12:28

相关问题