当前位置: 首页 > 知识库问答 >
问题:

多排序可选查询-带有分页的Spring REST控制器配置

劳嘉实
2023-03-14

我想构建一个能够处理多个可选排序查询的spring控制器。根据Spring.io规范,这些查询应该这样格式化

&sort=name,desc&sort=code,desc

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Subject {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String code; 
...

储存库

public interface SubjectRepository extends JpaRepository<Subject, Long> {
}

服务

@Override
public Page<SubjectDTO> listSubjectsPageble(PageRequest pageableRequest) {
    return subjectRepository.findAll(pageableRequest)
            .map(subjectMapper::subjectToSubjectDTO);
}
@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)));
}
@RequestParam MultiValueMap<String, String> params
@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;
        }
    }
@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;
    }

共有1个答案

闽经纬
2023-03-14

为什么不在控制器中使用分页呢?

Pageable可以处理许多排序查询,每个查询都将存储在orders列表中。而且,不需要任何可分页的参数。当您不在url中传递它们时,pageable将包含默认值(页面=0,size=20)。可以使用@PageableDefault注释更改默认值。

 类似资料:
  • 我试图指定一个用注释的存储库方法和一个带有对象的Pagable: 编辑1:此存储库正在扩展分页和排序存储库。 对象使用以下方法签名指定: 但生成的输出查询没有排序选项,例如: ...在我期待的时候: 这里有人遇到过这样的问题吗?我使用的是Spring Boot 1.5。x。

  • 我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM

  • 问题内容: 我想知道如何在单个页面应用程序中使用多个控制器。我试图找出答案,但发现的问题与我的非常相似,但是有很多不同的答案可以解决一个特定的问题,最终您不会在单个页面应用程序中使用多个控制器。 那是因为在单个页面上使用多个控制器并不明智吗?还是只是不可能? 假设我已经在主页上有一个踢屁股图像轮播控制器,但是随后我学习了如何(比如说)使用模态,为此我还需要一个新的控制器(或者其他我需要控制器的东西

  • 我无法在Spring Boot应用程序中查看任何文件。我让Spring Boot Servlet初始化器类正确地加载我的类,并且我有一个映射到该URL的控制器。我知道是因为我能在原木上看到。 WebConfig.java 2018-10-22 21:10:19,837[main][INFO]com.project.lnuproject.config.webconfig-注册表正确添加 但是,当我转

  • 我有一个带有spring分页的本地查询 我得到了例外