JPA-分页查询和常用属性

本文介绍了在Spring Boot中使用JPA进行分页查询的方法,重点关注Pageable对象的PageRequest.of()方法,用于指定查询的起始页和每页大小。同时,文章讨论了如何判断是否有下一页,通过比较Pageable对象的下一页页码与总页数来实现。代码示例简洁明了,适合实际项目中的快速应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Pageable pageRequest = PageRequest.of(int page, int size);
    • page:从第几页开始,第一页是0
    • size:每一页查询数量
Pageable pageRequest = PageRequest.of(0,3);
Page<User> all = userRepository.findAll(pageRequest);
Page结果集属性功能
getTotalElements()总条数
getTotalPages()总页数
getNumberOfElements()当前页的查询条数
getSize()当前页的大小
getNumber()当前页码
getSort()当前排序规则
getPageable()当前页码的Pageable对象
Pageable pageable = all.getPageable();
当前页码Pageable属性功能
getPageNumber()当前页码
getPageSize()当前页码查询条数
hasPrevious()判断是否还有上一页
next()下一个页码的Pageable对象

而Pageable对象并没有判断是否还有下一页的功能

可以这样做

先用next()获取去下一页的Pageable对象的页码并判断 是否大于 或 等于 查询出来的 总页数

如果满足则下一页不存在:返回false

否则下一页存在:返回true
代码如下

if (pageable.next().getPageNumber() >= all.getTotalPages()) {
    System.out.println("判断是否还有下一页:"+ false);
} else {
    System.out.println("判断是否还有下一页:"+ true);
}

这里做测试使用,实际使用三元表达式即可
如:

return pageable.next().getPageNumber() >= all.getTotalPages()? false : true;
Pageable pageRequest = PageRequest.of(0,3);
Page<User> all = userRepository.findAll(pageRequest);

System.out.println("总条数:"+all.getTotalElements());
System.out.println("总页数:"+all.getTotalPages());
System.out.println("当前页的查询条数:" + all.getNumberOfElements());
System.out.println("当前页的大小:" + all.getSize());
System.out.println("当前页码:" + all.getNumber());
System.out.println("当前排序规则:"+all.getSort());
System.out.println("当前页码的Pageable对象"+all.getPageable());

Pageable pageable = all.getPageable();
System.out.println("当前页码"+pageable.getPageNumber());
System.out.println("当前页码查询条数"+pageable.getPageSize());
System.out.println("判断是否还有上一页"+pageable.hasPrevious());

if (pageable.next().getPageNumber()>=all.getTotalPages()) {
    System.out.println("判断是否还有下一页:"+ false);
} else {
    System.out.println("判断是否还有下一页:"+ true);
}
打印结果

在这里插入图片描述

### 如何使用 Spring Data JPA 实现分页查询 Spring Data JPA 提供了一种简单而强大的机制来实现数据的分页查询。以下是关于其工作原理具体使用的详细介绍。 #### 使用 `Page` `Pageable` 进行分页查询Spring Data JPA 中,可以通过定义 Repository 方法并传递 `Pageable` 对象来进行分页操作。`Pageable` 是一个接口,用于描述分页请求中的页面索引、页面大小其他属性。返回结果通常是一个 `Page<T>` 类型的对象,它不仅包含了当前页的数据集合,还提供了有关总记录数、总页数以及其他元信息的方法[^1]。 下面展示了一个典型的例子: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { // 定义支持分页的自定义查询方法 Page<User> findByStatus(String status, Pageable pageable); } ``` 在这个例子中,`findByStatus` 方法接受两个参数:一个是过滤条件(如状态),另一个是 `Pageable` 参数用来指定分页细节。调用此方法时可以传入具体的分页配置[^3]。 #### 创建 `Pageable` 实例 为了创建一个 `Pageable` 实例,最常用的方式就是利用 `PageRequest.of()` 静态工厂方法。该方法允许开发者设置起始页码(从零开始)、每页显示条目数目以及可选的排序规则[^4]。 示例如下: ```java import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; // 基础分页无排序 Pageable pageable = PageRequest.of(pageNumber, pageSize); // 添加升序排序 Pageable sortedByAsc = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.ASC, "name")); // 复杂多字段排序 Pageable complexSort = PageRequest.of( pageNumber, pageSize, Sort.by(Sort.Order.asc("lastName"), Sort.Order.desc("firstName")) ); ``` 上述代码片段展示了三种不同类型的 `Pageable` 构造方式,分别对应于基本分页需求、单字段排序需求以及涉及多个字段复杂排序的需求。 #### 调用服务层完成最终查询逻辑 当 Repository 层已经准备好之后,在 Service 或 Controller 层就可以轻松地发起带有分页特性的数据库检索命令了。比如在一个 RESTful API 的场景里,可能像这样编写控制器代码: ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{pageNumber}/{pageSize}") public ResponseEntity<Page<User>> getUsers(@PathVariable int pageNumber, @PathVariable int pageSize){ Pageable paging = PageRequest.of(pageNumber - 1, pageSize); // 注意前端一般是从第一页即1开始计数 Page<User> pagedResult = userService.findAllUsers(paging); if (pagedResult.hasContent()) { return new ResponseEntity<>(pagedResult, HttpStatus.OK); } else{ return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } } ``` 这里需要注意的是,由于 HTTP 请求路径变量通常是基于人类习惯设定的第一页为编号 “1”,而在内部计算过程中则需转换成以零为基础的位置表示形式。 --- ### 总结 通过以上介绍可以看出,借助 Spring Data JPA 可以非常方便快捷地构建出具备强大功能的应用程序组件,尤其是针对大数据量情况下的高效管理方案更是不可或缺的一部分[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeathAndLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值