JpaRepository在角色列表中查找具有角色的用户

时间:2017-02-08 13:03:28

标签: java spring hibernate spring-data-jpa spring-repositories

我正在使用Spring HibernateJpaRepository作为数据库存储库。

我有两个用户存储类:

@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 */
}

如您所见,User可以分配多个角色。因此user1可以有ADMINMEMBER个角色,user2只有MEMBER个角色。

我希望ADMIN角色的用户(以及其他人)可以列出数据库中的所有用户(JpaRepository findAll()方法已足够)但只有MEMBER角色的用户只能列出MEMBER个角色的用户。

如何在JpaRepository中编写方法来实现这一目标?我在下面尝试了一些,但它不起作用:

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

List<User> findByRoles_Role(Role role);

也许有些自定义@Query

4 个答案:

答案 0 :(得分:4)

如果您可以进行自定义查询,请尝试以下操作:

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

答案 1 :(得分:0)

您需要为此案例使用自定义jpql查询。并使用自定义查询实现两个方法,一个用于admin,一个用于简单用户。 像

这样的东西

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

答案 2 :(得分:0)

如果您不想使用@query

按角色对象查询

List<User> findByRoles_(Role role);

按角色对象ID查询

List<User> findByRoles_Id(Long id);

答案 3 :(得分:-1)

如果要在JPA中检索带有角色名称列表的用户,则可以在存储库中添加以下方法。

List<User> findByRoles_NameIn(List<String> roles);