使用Spring Data JPA按角色查找用户

时间:2019-07-10 14:30:09

标签: java spring spring-data-jpa

我的用户实体

total = total * parseFloat(Val);

每个用户都可以扮演许多角色。给定一个角色(以String数据类型表示),我想获得所有具有此角色的用户。

例如

User1,角色为:“管理员”

User2,角色为:“用户”

User3,角色为:“管理员”

对于角色“ admin”,我希望获得用户1和用户2。

我对Spring Data Jpa所做的尝试:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String password;

    @ElementCollection
    private List<String> roles = new ArrayList<>();
}

但是我要出世了

  

org.hibernate.LazyInitializationException:无法延迟初始化   角色集合:   com.spring.certificatie.securityconfig.User.roles,无法   初始化代理-没有会话

2 个答案:

答案 0 :(得分:2)

在UserRepository中以这种方式使用

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Collection;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByRolesIn(Collection<String> names, Pageable pageable);
}

在您的控制器中

@GetMapping(value = "/api/usersByRole/{userRole}")
public List<User> getUser(@PathVariable String userRole, Pageable pageable){
    return userRepository.findByRolesIn(Arrays.asList(userRole), pageable);
}

然后您将得到这样的结果 enter image description here

答案 1 :(得分:0)

用户角色一对多映射
即角色列表是用户实体,您正在传递String作为角色列表。
这就是您获取异常的原因。

解决方案:

  • 使用findByRolesIn(List<String> roles)代替findByRoles(String role)
  • 或者,如下进行一对一映射:

    @Column(nullable = false)
    private String role;
    
  • 或者,如下所示使用JPA查询或本机查询。

    @Query( "select u from User u  where u.roles in :roles" )
    public List<User> findByRoles(@Param("roles") List<String> roles);