深入理解Pageable

一、Pageable的概念

Pageable实现了分页的概念,它是一个接口,提供了分页的各种参数来进行查询。通过它我们可以方便地实现数据的分页查询,例如在网页数据展现或者手机APP上翻页展示等。

public interface Pageable {
    int getPageNumber();
    int getPageSize();
    int getOffset();
    Sort getSort();
    boolean hasPrevious();
    Pageable next();
    Pageable previousOrFirst();
    Pageable first();
}

Pageable中的方法比较简单,主要用于获取分页的一些参数。其中getPageNumber()方法表示当前页码,getPageSize()表示每页显示记录数,getOffset()表示偏移量,getSort()表示根据什么属性进行排序等等。

二、使用Pageable实现简单分页查询

使用Pageable进行分页查询的方式,通常是通过数据持久化层框架的查询函数调用。以JPA为例:

@Repository
public interface UserRepository extends JpaRepository {
    Page findAll(Pageable pageable);
}

在接口中定义的findAll()方法传入的参数为Pageable类型,通过调用findAll()方法即可返回一个Page对象,该对象中封装了一些分页相关的信息,例如当前页码、总页数、总记录数、每页显示的记录数等。

接下来我们可以在controller层进行调用,并处理返回值:

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public Map getUsers(@RequestParam(name = "page", defaultValue = "0") int page,
                                        @RequestParam(name = "size", defaultValue = "10") int size) {
        Pageable pageable = PageRequest.of(page, size);
        Page users = userRepository.findAll(pageable);
        Map result = new HashMap();
        result.put("users", users.getContent());
        result.put("currentPage", users.getNumber());
        result.put("totalPages", users.getTotalPages());
        result.put("totalItems", users.getTotalElements());
        return result;
    }
}

在controller层我们实例化了一个Pageable对象,并根据前端传递的参数进行了分页查询,最后将分页查询的结果封装到Map中返回给前端,提供给前端使用。

三、分页排序

在分页的过程中,经常需要对数据进行排序,我们可以通过Pageable接口提供的getSort()方法实现分页排序。下面的例子中,我们对username属性进行升序排序:

Pageable pageable = PageRequest.of(page, size, Sort.by("username").ascending());

类似的,如果我们需要对多个属性进行排序,只需要在Sort.by()方法中添加多个Sort.Order即可。例如,以下代码将先对username字段进行升序排序,然后对age字段进行降序排序:

Pageable pageable = PageRequest.of(page, size, Sort.by("username").ascending().and(Sort.by("age").descending()));

四、自定义分页参数

除了默认提供的分页参数,例如每页显示的记录数、当前页码等,我们还可以通过实现Pageable接口来实现自定义的分页参数。例如,我们可以实现以下代码:

public class MyPageable implements Pageable {
    private int pageNo;
    private int pageSize;
    private String orderByColumn;
    private boolean isAsc;

    public MyPageable(int pageNo, int pageSize, String orderByColumn, boolean isAsc) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.orderByColumn = orderByColumn;
        this.isAsc = isAsc;
    }

    @Override
    public int getPageNumber() {
        return pageNo;
    }

    @Override
    public int getPageSize() {
        return pageSize;
    }

    @Override
    public long getOffset() {
        return (long) (pageNo - 1) * pageSize;
    }

    @Override
    public Sort getSort() {
        return isAsc ? Sort.by(orderByColumn).ascending() : Sort.by(orderByColumn).descending();
    }

    @Override
    public Pageable next() {
        return new MyPageable(pageNo + 1, pageSize, orderByColumn, isAsc);
    }

    @Override
    public Pageable previousOrFirst() {
        return pageNo  1;
    }
}

自定义的MyPageable类实现了Pageable接口,并覆盖了其所有方法。其中,我们可以实现自定义的分页参数,例如orderByColumn属性表示按照哪个字段进行排序,isAsc表示是否是升序排列等。实现后,我们就可以直接使用new MyPageable()的方式来进行分页查询。

五、总结

总的来说,使用Pageable可以方便地实现数据的分页查询,减轻后端查询处理的压力,同时也可以带来更好的用户交互体验。在使用Pageable进行分页查询的过程中,我们可以通过排序、自定义参数等方式来满足不同的需求。

原创文章,作者:HNOTW,如若转载,请注明出处:https://www.506064.com/n/372907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
HNOTWHNOTW
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25

发表回复

登录后才能评论