Val*_*lan 8 java rest spring pagination jpa
我想构建一个可以处理多个可选排序查询的弹簧控制器。根据spring.io规范,这些查询应该这样格式化
&sort=name,desc&sort=code,desc
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过一个带有要排序的值的排序实例来完成,并且方向按照Gregg分别给出但这与 Spring 规范或处理多个排序值不匹配。
我不确定如何将 spring 规范格式中的多个查询转换为可以传递给我的 PageRequest 然后传递给我的存储库的 Sort 。此外,我希望能够使这些成为可选的,如果可能的话,如果根据Rasheed Amir (@SortDefault)需要默认值来实现这一点,我可以使用基于 @Anotation 的配置会很棒
这是我正在使用的基础知识..
领域
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Subject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String code;
...
Run Code Online (Sandbox Code Playgroud)
存储库
public interface SubjectRepository extends JpaRepository<Subject, Long> {
}
Run Code Online (Sandbox Code Playgroud)
服务
@Override
public Page<SubjectDTO> listSubjectsPageble(PageRequest pageableRequest) {
return subjectRepository.findAll(pageableRequest)
.map(subjectMapper::subjectToSubjectDTO);
}
Run Code Online (Sandbox Code Playgroud)
控制器
@GetMapping
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('LECTURER')")
public Page<SubjectDTO> getSubjects(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("sort") String sort
) {
return subjectService.listSubjectsPageble(PageRequest.of(page, size, new Sort(sort)));
}
Run Code Online (Sandbox Code Playgroud)
因此,根据Ralph 的说法,在控制器中,我根本不知道如何处理\从 RequestParam 填充排序我应该能够使用类似下面的东西从一个参数中获取多个值,但我不知道如何然后将其传递给 Sort。
我知道 Sort 可以采用多个参数,但只能采用一种排序方向。然后粗糙的我想让它们成为可选的。
@RequestParam MultiValueMap<String, String> params
Run Code Online (Sandbox Code Playgroud)
请帮忙,我还是个菜鸟 :) 谢谢
编辑
多亏了Dullimeister 的一篇帖子,我解决了一些问题,但这种方法感觉有点混乱,仍然无法处理多个排序参数。有谁知道更好的方法或者这是要走的路吗?
@GetMapping
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('LECTURER')")
public Page<SubjectDTO> getSubjects(
@RequestParam(value = "page", defaultValue = "0", required = false) int page,
@RequestParam(value = "size", defaultValue = "10", required = false) int size,
@RequestParam(value = "sort", defaultValue = "name,ASC", required = false) String sortBy
) {
String[] sort = sortBy.split(",");
String evalSort = sort[0];
String sortDirection = sort[1];
Sort.Direction evalDirection = replaceOrderStringThroughDirection(sortDirection);
Sort sortOrderIgnoreCase = Sort.by(new Sort.Order(evalDirection,evalSort).ignoreCase());
return subjectService.listSubjectsPageble(PageRequest.of(page, size, sortOrderIgnoreCase));
}
private Sort.Direction replaceOrderStringThroughDirection(String sortDirection) {
if (sortDirection.equalsIgnoreCase("DESC")){
return Sort.Direction.DESC;
} else {
return Sort.Direction.ASC;
}
}
Run Code Online (Sandbox Code Playgroud)
最终解决方案 谢谢大家,这就是我最终的结果。不确定它是否是完美的方式,但它有效:) 最后我不得不用分号替换逗号,因为 FormattingConversionService 会自动将单个排序参数解析为字符串而不是 Sting[]
@GetMapping
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('LECTURER')")
public Page<SubjectDTO> getSubjects(
@RequestParam(value = "page", defaultValue = "0", required = false) int page,
@RequestParam(value = "size", defaultValue = "10", required = false) int size,
@RequestParam(value = "sort", defaultValue = "name;ASC", required = false) String[] sortBy
Sort allSorts = Sort.by(
Arrays.stream(sortBy)
.map(sort -> sort.split(";", 2))
.map(array ->
new Sort.Order(replaceOrderStringThroughDirection(array[1]),array[0]).ignoreCase()
).collect(Collectors.toList())
);
return subjectService.listSubjectsPageble(PageRequest.of(page, size, allSorts));
private Sort.Direction replaceOrderStringThroughDirection(String sortDirection) {
if (sortDirection.equalsIgnoreCase("DESC")){
return Sort.Direction.DESC;
} else {
return Sort.Direction.ASC;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5349 次 |
| 最近记录: |