我的用户实体
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,无法 初始化代理-没有会话
答案 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);
}
答案 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);