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 JpaRepository
findAll()
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
?
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
Vous devez ajouter «distinct» après sélectionner dans ce cas –
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