springboot分页 pageable作参数以及List转换为Page

Page与Pageable


Page是spring data jpa提供的一个接口。包含了部分数据集合以及相关的下一部分数据集合以及数据总数等信息。可以获得当前的页面的记录以及总页数和总数据数,以及数据是否能够再分页。

PageImpl是Page接口的实现类。重写了 hashcode(),equals(),toString()方法。

Pageable也是spring data jpa提供的接口,包含了分页的信息,页数getPageNumber()和每页的数据数getPageSzie()。以便JPA通过
Pageable得到一个带分页信息的sql语句。PageRequest是Pageable的实现类。提供了排序功能。

使用Page实现分页


数据库访问层的接口继承JpaRepository接口JpaSpecificationExecutor接口

 public interface UserRepository extends JpaRepository<User, String>,JpaSpecificationExecutor<User> {
     public User findByName(String name);
     @Query(value="select count(*) from user",nativeQuery = true)
     public int countUser();
     public User findByUserId(String userId);
     @Modifying
     @Query(value="update user set password=?1 where user_id=?2",nativeQuery = true)
    public void updatePassword(String newpassword,String userId);
     @Modifying
     @Query(value="update user set permission=?1 where user_id=?2",nativeQuery = true)
    	public void updatePermission(String permission,String userId);
    }

这样可以实现Page实现分页查询

定义sql语句中的Pageable参数


定义Pageable参数使用了Pageable接口的实现类PageRequest。之前的new PageRequest()方式已被弃用。现在使用PageRequest.of来定义Pageable接口的具体内容,如数据为总集合的第几页以及页数。

 Pageable pageable;
 pageable= PageRequest.of(page,pageSize, Sort.by(Sort.Direction.DESC,"time"));

这段代码定义了查询数据集的第几页数据以及每页的数据数。并按time属性的倒序排序查询的结果。

@Query定义的sql语句声明pagable参数


  @Query(value="select * from camera where user_id=?1 order by ?#{#pageable}",nativeQuery = true)
  public Page<Camera> findAllByUserId(String userId, Pageable pageable);

使用?#{#pageable}声明pageable参数。

List转换为Page


有时数据库操作需要执行动态sql语句,我们可以通过entityManager实现动态sql。但是如果采用entityManager执行访问数据库操作的话,我们需要借助NativeQuery执行sql语句,这样返回的结果一般是List类型的。那么,如何让结果转换为Page类型呢?其实,只需要借助Pageable接口和Page接口的实现PageImpl。

具体的代码如下:

  String sql="select * from "+tableName+" order by time desc";//" limit "+Integer.toString(page*pageSize)+","+Integer.toString(pageSize);
  Query nativeQuery=entityManager.createNativeQuery(sql);
  List<WeighData> resultList=nativeQuery.getResultList();
  int begin= (int) pageable.getOffset();
  int en=(begin+pageable.getPageSize())>resultList.size()?resultList.size():(begin+pageable.getPageSize());
  return new PageImpl<WeighData>(resultList.subList(begin,en),pageable,resultList.size());

其中通过getOffset获得这一页的开头在原结果集中的位置,并且通过判断开头的位置加上每页数据数后的结果是否大于最后一个数据在原数据集的位置获取每页的最后数据的位置。(末页的数据数可能不够一个pagesize),最终获取到一个Page。完成(类似于sql中的limit)分页查询。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中,可以利用Pageable插件实现分页和查询。Pageable是Spring Data库中定义的一个接口,它抽象了与分页相关的所有信息,包括页码、每页大小等。通过Pageable接口,我们可以获取所有与分页相关的信息。 下面是一个示例代码,展示了如何在控制层中使用Pageable插件进行分页查询: ```java // 分页 @RequestMapping("/findPage") public String findByPage(Model model, Integer pageNum) { // 当前页面为空时,赋值为一,代表当前为第一页 if (pageNum == null) { pageNum = 1; } Pageable pageable = PageRequest.of(pageNum - 1, 5); Page<List<Map>> page = serviceStudent.findPage(pageable); model.addAttribute("pageInfo", page); return "index"; } ``` 在上述代码中,首先判断当前页码是否为空,如果为空则默认为第一页。然后使用PageRequest.of方法创建一个Pageable对象,指定页码和每页大小。接下来调用serviceStudent的findPage方法,传入Pageable对象进行分页查询。最后将查询结果存入model中,返回index页面。 为了在显示页面中实现首页、上一页、下一页和尾页等功能,返回值需要使用Page<List<?>>类型。这样可以将数据交给Page类处理并进行分页。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Boot 利用Pageable插件实现分页和查询](https://blog.csdn.net/CSDN_java1005/article/details/106235082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值