当前位置: 首页 > news >正文

spring-boot List转Page

需求:班级与教师是多对多关系,在后台班级管理需要添加一个接口,传入教师的id和pageable,返回带分页数据的班级信息。

Page<Klass> pageByTeacher(Long teacherId, Pageable pageable);

一开始打算是在KlassRepository(继承自PagingAndSortingRepository)中添加一个类似findByElementId的接口,然后直接返回带分页的数据。但是试了几次并不成功,无论是把teacher还是将带teacher的List传入方法中都失败。

换了一种思路,直接调TeacherRepository的FindById()方法找到teacher,然后返回teacher的成员klassList就行了。

    Teacher teacher = teacherRepository.findById(teacherId).get();
    List<Klass> klassList = teacher.getKlassList();

但是光返回klassList还不行,需要将它包装成Page才行,去官网上查到了一种使用List构造Page的方法

PageImpl
public PageImpl(List<T> content,
                Pageable pageable,
                long total)
Constructor of PageImpl.
Parameters:
content - the content of this page, must not be null.
pageable - the paging information, must not be null.
total - the total amount of items available. The total might be adapted considering the length of the content given, if it is going to be the content of the last page. This is in place to mitigate inconsistencies.

参数:
content: 要传的List,不为空
pageable: 分页信息,不为空
total: 可用项的总数。如果是最后一页,考虑到给定内容的长度,total可以被调整。这是为了缓解不一致性。(这句没懂什么意思),可选

一开始还以为它会自己按照传入的参数分割List

Page<Klass> klassPage = new PageImpl<Klass>(klassList, pageable, klassList.size());

clipboard.png

结果debug发现不行,得手动分割,就去网上参考了别人的写法

    // 当前页第一条数据在List中的位置
    int start = (int)pageable.getOffset();
    // 当前页最后一条数据在List中的位置   
    int end = (start + pageable.getPageSize()) > klassList.size() ? klassList.size() : ( start + pageable.getPageSize());
    // 配置分页数据
    Page<Klass> klassPage = new PageImpl<Klass>(klassList.subList(start, end), pageable, klassList.size());

debug查看结果

clipboard.png
最后为了增加复用性,改成范型方法:

    public <T> Page<T> listConvertToPage(List<T> list, Pageable pageable) {
    int start = (int)pageable.getOffset();
    int end = (start + pageable.getPageSize()) > list.size() ? list.size() : ( start + pageable.getPageSize());
    return new PageImpl<T>(list.subList(start, end), pageable, list.size());
}

相关文章:

  • Python 之网络式编程
  • 最新人脸识别开发经验demo
  • 2019年3月
  • CodeForces 226C The table[贪心]
  • ThinkPHP 发布 5.1.35 版本,常规更新
  • 网页错误是不会报错的
  • 遇到Vue CLI网站显示异常
  • 教你从头写游戏服务器框架
  • C# 免费离线人脸识别 2.0 Demo
  • IDEA中使用Remote来远程调试程序
  • 15-Flink实战项目之实时热销排行
  • 随笔之python下载与安装
  • print(1,2,3,sep=':')的输出结果是?
  • windows下安装jdk与jmeter
  • 上海瀚示—电力仓库的电子货位标签应用
  • 【Amaple教程】5. 插件
  • 2017-09-12 前端日报
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Apache Spark Streaming 使用实例
  • bearychat的java client
  • CentOS 7 修改主机名
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • docker-consul
  • Fastjson的基本使用方法大全
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP 简介
  • Javascript编码规范
  • JavaScript设计模式之工厂模式
  • JS题目及答案整理
  • JS字符串转数字方法总结
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MYSQL 的 IF 函数
  • spark本地环境的搭建到运行第一个spark程序
  • springboot_database项目介绍
  • 构建二叉树进行数值数组的去重及优化
  • 官方解决所有 npm 全局安装权限问题
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 软件开发学习的5大技巧,你知道吗?
  • 通过npm或yarn自动生成vue组件
  • 一道面试题引发的“血案”
  • Python 之网络式编程
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (04)odoo视图操作
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)常见O(n^2)排序算法解析
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C#)获取字符编码的类
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)Java算法:二分查找