2017-02-08 1 views
1

J'utilise Spring avec Hibernate et JpaRepository comme référentiel de base de données.JpaRepository find Utilisateur avec rôle dans la liste des rôles

J'ai deux classes pour le stockage de l'utilisateur:

@Entity 
public class User { 
    @Id 
    private Long id; 

    private String username; 

    private String password; 

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
    private List<UserRole> roles; 
} 

@Entity 
public class UserRole { 
    @Id 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @Enumerated(EnumType.STRING) 
    private Role role; 
} 

public enum Role { 
    ADMIN, 
    MEMBER; 
    /* some others in the future */ 
} 

Comme vous pouvez le voir User peut avoir plusieurs rôles assignés. Donc, user1 peut avoir ADMIN et MEMBER rôles et user2 rôle seulement MEMBER.

Je voudrais utilisateur ADMIN rôle (entre autres) pourrait lister tous les utilisateurs dans la base de données (méthode JpaRepositoryfindAll() suffit) mais l'utilisateur avec seulement MEMBER rôle pourrait énumérer uniquement les utilisateurs avec MEMBER rôle.

Comment écrire la méthode dans JpaRepository pour y parvenir? J'ai essayé quelques-uns ci-dessous, mais il ne fonctionne pas:

List<User> findByRoles_RoleIn(Collection<Role> roles); 

ou

List<User> findByRoles_Role(Role role); 

Peut-être une coutume @Query?

Répondre

1

Si vous pouvez faire une requête personnalisée essayez suivante:

@Query("select u from User u inner join u.roles r where r.role in :roles") 
List<User> findBySpecificRoles(@Param("roles") List<Role> roles); 
+0

merci pour votre réponse, mais cela ne fonctionne pas vraiment comme il devrait. Je reçois des entrées dupliquées pour chaque utilisateur lorsqu'il a plusieurs rôles qui correspondent à la liste . Comment le réparer? – user3626048

+0

Vous devez ajouter «distinct» après sélectionner dans ce cas –

+0

ok «distinct» a aidé avec cela, mais j'ai trouvé un autre problème et je ne pense pas que ce simple est suffisant. Quand je passe MEMBRE comme argument je devrais obtenir la liste avec des utilisateurs qui ont seulement le rôle de MEMBRE, maintenant j'obtiens des utilisateurs avec des rôles de MEMBRE et d'ADMIN. J'ai essayé Reverse Query à "[...] pas dans: rôles" et j'ai passé ADMIN comme argument mais cela n'a pas fonctionné non plus. – user3626048

0

Vous devez utiliser une requête JPQL personnalisée pour ce cas. Et implémenter deux méthodes avec une requête personnalisée une pour l'administrateur et une pour les utilisateurs simples. Quelque chose comme

@Query("SELECT u FROM User u JOIN u.roles r WHERE r.role=:rolename")