我正在使用Spring
Hibernate
和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 */
}
如您所见,User
可以分配多个角色。因此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
?
答案 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);