首页 > 解决方案 > 如何在spring boot中使用分页对存储库实体进行排序

问题描述

我正在用 Spring Boot 编写一个 REST API。在这里,我正在尝试使用“PagingAndSortingRepository”对列表进行排序。这是我在 Controller 类中尝试过的方法

@GetMapping public ResponseEntity
<PagedModel<ComplainDTO>> getComplains(@RequestParam(defaultValue = "0",value = "page",required =false)int page, @RequestParam(value="sortBy" ,required = false,defaultValue = "complainId") String sortBy, PagedResourcesAssembler assembler) { 
    return ResponseEntity.status(HttpStatus.OK)
     .body(assembler.toModel(complainService.getAllComplains(page,sortBy)));
  }

我的服务方法

@Override
    public Page<ComplainDTO> getAllComplains(int page,String sortBy) {

        Pageable pageable = PageRequest.of(page,20, Sort.by(sortBy));
        Page<ComplainEntity> result =complainRepository.findAll(pageable);
        return result.map(complainEntity -> toDTO(complainEntity));
    }

我从消费者那里获取输入以根据给定的属性对列表进行排序,但是 Sort 的默认行为是 Ascending 。那么,除了使用 if-else 之外,我如何实现这个获取用户参数是升序还是降序。

标签: javaspring-bootsortingpaginationspring-data

解决方案


一种选择是要求用户使用@RequestParam

 @GetMapping public ResponseEntity
<PagedModel<ComplainDTO>> getComplains(@RequestParam(defaultValue = "0",value = "page",required =false)int page, 
        @RequestParam(value="sortBy" ,required = false,defaultValue = "complainId") String sortBy, 
        @RequestParam(value="orderBy" ,required = false,defaultValue = "ASC") String orderBy, PagedResourcesAssembler assembler) { 

return ResponseEntity.status(HttpStatus.OK)
 .body(assembler.toModel(complainService.getAllComplains(page,sortBy,orderBy)));

}

然后在服务中将排序顺序传递给Sort方法

@Override
public Page<ComplainDTO> getAllComplains(int page,String sortBy, String orderBy) {

    Pageable pageable = PageRequest.of(page,20, Sort.by(Sort.Direction.valueOf(orderBy),sortBy));
    Page<ComplainEntity> result =complainRepository.findAll(pageable);
    return result.map(complainEntity -> toDTO(complainEntity));
}

推荐阅读