私はSpring
とHibernate
とJpaRepository
をデータベースリポジトリとして使用しています。あなたが割り当てられた複数の役割を持つことができますUser
を見ることができるようにJpaRepositoryロールのリストでロールを持つユーザを見つけよう
@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 */
}
:
は、私は、ユーザーのストレージのための2つのクラスがあります。したがって、user1
は、ADMIN
とMEMBER
ロールを持ち、user2
ロールはMEMBER
ロールのみを持つことができます。私がしたい
(とりわけ)ADMIN
ロールを持つユーザーは、データベース内のすべてのユーザー(JpaRepository
findAll()
方法で十分です)をリストでしたが、唯一のMEMBER
役割を持つユーザーは、MEMBER
役割を持つユーザーのみをリストすることができます。
これを達成するには、JpaRepository
でメソッドを書き込む方法は?私は以下のいくつかを試してみましたが、それは働いていない:
List<User> findByRoles_RoleIn(Collection<Role> roles);
または
List<User> findByRoles_Role(Role role);
をたぶんいくつかのカスタム@Query
?
よう 何かがあなたの答えをありがとうございましたが、それは本当にそれが必要のように動作しません。リストに適合する複数のロールがある場合、すべてのユーザーに重複したエントリが表示されます。それを修正するには? –
user3626048
その場合に「distinct」を追加する必要があります。 –
ok 'distinct'はそれを助けましたが、別の問題を発見しました。このような単純ではないと思います。 MEMBERを引数として渡すと、MEMBERロールしか持たないユーザーのリストが取得されるはずです。メンバーとADMINロールを持つユーザーが表示されます。逆のクエリを "[...] not in:roles"にしてADMINを引数として渡しましたが、どちらもうまくいきませんでした。 – user3626048