Jpa 存储库查找所有类型为 HashSet
Jpa repository find all with type HashSet
在我的 Spring 引导应用程序中,我有两个实体用户和权限。有ROLE_USER、ROLE_ADMIN三个参数,ROLE_SYSTEM可赋予用户权限,一个用户可以有多个权限。在用户实体中,我创建了连接用户和权限的连接列,因此我可以使用 Join table 为用户分配多个权限,实体字段如下所示:
@JsonIgnore
@ManyToMany
@JoinTable(
name = "jhi_user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Authority> authorities = new HashSet<>();
因此,hibernate 使用此字段创建了第三个 table,它具有用户 ID 和权限角色。在 Repository 中,我使用了 Hibernate JPARepository。并使用 findAll() 我得到了所有用户。
控制器:
在控制器中:
@GetMapping("/users")
@Timed
@Secured({ AuthoritiesConstants.ADMIN, AuthoritiesConstants.SYSTEM })
public ResponseEntity<List<UserDTO>> getAllUsers(Pageable pageable) {
final Page<UserDTO> page = userService.getAllManagedUsers(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/users");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
在役:
@Transactional(readOnly = true)
public Page<UserDTO> getAllManagedUsers(Pageable pageable) {
return userRepository.findAll(pageable).map(UserDTO::new);
}
在存储库中:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Pageable pageable);
}
我已经在存储库中尝试过这个:
@Query("select users from User users where users.authorities = 'ROLE_USER'")
Page<User> getAllByAuthoriy(Pageable pageable);
权威实体:
@Entity
@Table(name = "jhi_authority")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Authority implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull
@Size(max = 50)
@Id
@Column(length = 50)
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
所以,现在我必须将查询从 findAll 更改为 findAllByAuthorities(Pageable pageable, set authorities)。但这不起作用,显示类型转换错误。
如何获取角色为 ROLE_USER 的所有用户?
这是解决方案,
我必须编写一个查询以从用户 table 获取用户,该权限是 user_role。为此,我必须传递一个字符串以在 HashSet 中进行匹配。
@Query("select users from User users where 'ROLE_USER' member of users.authorities")
Page<User> getAllByAuthoriy(Pageable pageable);
在我的 Spring 引导应用程序中,我有两个实体用户和权限。有ROLE_USER、ROLE_ADMIN三个参数,ROLE_SYSTEM可赋予用户权限,一个用户可以有多个权限。在用户实体中,我创建了连接用户和权限的连接列,因此我可以使用 Join table 为用户分配多个权限,实体字段如下所示:
@JsonIgnore
@ManyToMany
@JoinTable(
name = "jhi_user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Authority> authorities = new HashSet<>();
因此,hibernate 使用此字段创建了第三个 table,它具有用户 ID 和权限角色。在 Repository 中,我使用了 Hibernate JPARepository。并使用 findAll() 我得到了所有用户。 控制器:
在控制器中:
@GetMapping("/users")
@Timed
@Secured({ AuthoritiesConstants.ADMIN, AuthoritiesConstants.SYSTEM })
public ResponseEntity<List<UserDTO>> getAllUsers(Pageable pageable) {
final Page<UserDTO> page = userService.getAllManagedUsers(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/users");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
在役:
@Transactional(readOnly = true)
public Page<UserDTO> getAllManagedUsers(Pageable pageable) {
return userRepository.findAll(pageable).map(UserDTO::new);
}
在存储库中:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Pageable pageable);
}
我已经在存储库中尝试过这个:
@Query("select users from User users where users.authorities = 'ROLE_USER'")
Page<User> getAllByAuthoriy(Pageable pageable);
权威实体:
@Entity
@Table(name = "jhi_authority")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Authority implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull
@Size(max = 50)
@Id
@Column(length = 50)
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
所以,现在我必须将查询从 findAll 更改为 findAllByAuthorities(Pageable pageable, set authorities)。但这不起作用,显示类型转换错误。 如何获取角色为 ROLE_USER 的所有用户?
这是解决方案, 我必须编写一个查询以从用户 table 获取用户,该权限是 user_role。为此,我必须传递一个字符串以在 HashSet 中进行匹配。
@Query("select users from User users where 'ROLE_USER' member of users.authorities")
Page<User> getAllByAuthoriy(Pageable pageable);