Pageable 菜教程
基本概念
Pageable
是 Spring Data 提供的分页接口,用于在数据查询中实现分页和排序功能。通常与 Page
或 Slice
结合使用,表示查询结果的分页数据。
核心方法
Pageable
接口定义了以下关键方法:
int getPageNumber()
:返回当前页码(从 0 开始)。int getPageSize()
:返回每页的数据量。long getOffset()
:返回当前页的起始偏移量。Sort getSort()
:返回排序规则(如按字段升序/降序)。
创建 Pageable 对象
通过 PageRequest
(Pageable
的实现类)创建分页请求:
// 基础分页(页码从 0 开始,每页 10 条)
Pageable pageable = PageRequest.of(0, 10);// 分页 + 排序(按 name 升序)
Pageable pageableWithSort = PageRequest.of(0, 10, Sort.by("name").ascending());// 多字段排序(先按 name 降序,再按 id 升序)
Sort sort = Sort.by("name").descending().and(Sort.by("id").ascending());
Pageable pageableWithMultiSort = PageRequest.of(0, 10, sort);
在 Repository 中使用
Spring Data JPA 的 Repository 可直接支持 Pageable
参数:
public interface UserRepository extends JpaRepository<User, Long> {Page<User> findByName(String name, Pageable pageable);
}
调用示例:
Page<User> users = userRepository.findByName("Alice", PageRequest.of(0, 5));
users.getContent(); // 获取当前页数据
users.getTotalPages(); // 获取总页数
users.getTotalElements();// 获取总数据量
自定义分页逻辑
若需手动处理分页逻辑,可通过 Pageable
计算偏移量:
List<User> users = entityManager.createQuery("SELECT u FROM User u", User.class).setFirstResult((int) pageable.getOffset()).setMaxResults(pageable.getPageSize()).getResultList();
前端传递分页参数
通常通过 HTTP 请求参数传递分页信息(如 ?page=0&size=10&sort=name,asc
),后端用 @PageableDefault
设置默认值:
@GetMapping("/users")
public Page<User> getUsers(@PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {return userRepository.findAll(pageable);
}
注意事项
- 页码从 0 开始,与前端约定时需明确。
- 排序字段需与实体类属性名一致,否则抛出异常。
- 复杂分页查询可结合
Specification
或QueryDSL
使用。
通过上述方法,可以高效实现分页查询功能,适用于大数据量场景。