2017-02-08 16 views
1

私はSpringHibernateJpaRepositoryをデータベースリポジトリとして使用しています。あなたが割り当てられた複数の役割を持つことができます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は、ADMINMEMBERロールを持ち、user2ロールはMEMBERロールのみを持つことができます。私がしたい

(とりわけ)ADMINロールを持つユーザーは、データベース内のすべてのユーザー(JpaRepositoryfindAll()方法で十分です)をリストでしたが、唯一のMEMBER役割を持つユーザーは、MEMBER役割を持つユーザーのみをリストすることができます。

これを達成するには、JpaRepositoryでメソッドを書き込む方法は?私は以下のいくつかを試してみましたが、それは働いていない:

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

または

List<User> findByRoles_Role(Role role); 

をたぶんいくつかのカスタム@Query

答えて

1

カスタムクエリのために行くことができる場合は、以下試してください。

@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

よう 何かがあなたの答えをありがとうございましたが、それは本当にそれが必要のように動作しません。リストに適合する複数のロールがある場合、すべてのユーザーに重複したエントリが表示されます。それを修正するには? – user3626048

+0

その場合に「distinct」を追加する必要があります。 –

+0

ok 'distinct'はそれを助けましたが、別の問題を発見しました。このような単純ではないと思います。 MEMBERを引数として渡すと、MEMBERロールしか持たないユーザーのリストが取得されるはずです。メンバーとADMINロールを持つユーザーが表示されます。逆のクエリを "[...] not in:roles"にしてADMINを引数として渡しましたが、どちらもうまくいきませんでした。 – user3626048

0

あなたがこのケースにカスタムJPQLクエリを使用する必要があります。また、管理者用のカスタムクエリとシンプルユーザー用のカスタムクエリの2つのメソッドを実装します。

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

関連する問題