2012-07-30 3 views
1

Je travaille actuellement sur un projet de grails en ce moment où j'ai dû combiner le résultat de ma requête dans une liste. Le problème est, il y a des cas que le résultat de ma requête renvoie des valeurs égales, ce qui provoque un message d'erreur: Un autre objet avec la même valeur d'identifiant a déjà été associé à la sessionComment vérifier si les listes ont la même valeur dans les grails?

Voici mon code:

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

Le rôle d'objet ici peut contenir deux noms de rôles différents, dans certains cas, les autorisations présentes dans ces noms de rôle sont identiques.

Comment vais-je modifier ma requête de telle manière que je puisse seulement obtenir les valeurs uniques du résultat? J'ai essayé d'utiliser distinct, mais cela n'a pas fonctionné.

Aidez s'il vous plaît!

Merci!

Répondre

1

Je ne suis pas sûr si c'est ce que vous essayez de faire, mais à partir de votre description, je pense que c'est ça. Ce que fait la ligne ci-dessous est itérer sur vos rôles passés (je suppose que ce sont des id de rôle de la syntaxe) et pour chaque id de rôle, il trouve une RolePermission pour le rôle. Chaque autorisation trouvée est ajoutée en tant que liste aux autorisations. Donc, à la fin, vous devriez avoir une liste de RolePermissions. Maintenant, ce que je ne comprends pas, c'est la distinction que vous recherchez. Êtes-vous en train de dire qu'un Role peut renvoyer plus d'une RolePermission et que vous essayez de vous assurer que les RolePermissions retournées sont uniques dans la liste finale? Si c'est le cas, vous pouvez renvoyer la liste en tant qu'ensemble (c'est-à-dire renvoyer les autorisations en tant que Set). S'il vous plaît laissez-moi savoir où ma compréhension est insuffisante.

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

Sinon, vous pouvez utiliser un critère:

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

Je n'ai pas exécuté ce par le compilateur, mais il devrait fonctionner.

+0

Le scénario est le suivant: l'objet de rôle peut contenir plusieurs valeurs (ROLE_ADMIN, ROLE_SYSTEM_MANAGER), désormais ROLE_ADMIN peut contenir des autorisations pouvant être présentes dans ROLE_SYSTEM_MANAGER. Dans ma liste d'autorisations, je dois obtenir les autorisations de ROLE_ADMIN et de ROLE_SYSTEM_MANAGER. Avec mon hsql existant, j'obtiens toutes les permissions contenues par les deux rôles. Ce que je voulais faire, c'est obtenir seulement les permissions DISTINCT/UNIQUE des rôles. Exemple, ROLE_ADMIN et ROLE_SYSTEM_MANAGER ont des autorisations READ_ANNOUNCEMENT, je n'ai besoin que d'une seule instance de ces autorisations. – chemilleX3

+0

d'accord, alors ma réponse se tient. 'renvoyer des permissions comme Set' fera que votre liste sera castée en Set, ce qui garantit l'unicité. Vous devrez peut-être implémenter Equals et Hash sur RolePermissions pour vous assurer qu'ils sont correctement comparés. Si vous utilisez IntelliJ ou Eclipse, vous pouvez utiliser une méthode Equals/Hash qui devrait fonctionner immédiatement. Je veux aussi ajouter que ce n'est pas la seule solution. Vous pouvez créer un critère à utiliser sur RolePermission et appeler criteria.listdistinct(). Je publierai une mise à jour de ma réponse avec la solution de critères dans une minute. –

+0

merci beaucoup Michael..Avoir considérer ceci..ill mise à jour u plus tard si ça va fonctionner :) – chemilleX3

Questions connexes