当前位置: 首页 > 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
  • 上海瀚示—电力仓库的电子货位标签应用
  • 2019年如何成为全栈工程师?
  • Angular6错误 Service: No provider for Renderer2
  • canvas 高仿 Apple Watch 表盘
  • canvas绘制圆角头像
  • Docker容器管理
  • exif信息对照
  • Linux gpio口使用方法
  • Mysql数据库的条件查询语句
  • nginx 配置多 域名 + 多 https
  • SpringBoot 实战 (三) | 配置文件详解
  • 百度地图API标注+时间轴组件
  • 技术胖1-4季视频复习— (看视频笔记)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解移动APP与web APP的区别
  • 终端用户监控:真实用户监控还是模拟监控?
  • 通过调用文摘列表API获取文摘
  • ​ssh免密码登录设置及问题总结
  • ​用户画像从0到100的构建思路
  • #Z2294. 打印树的直径
  • #图像处理
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (万字长文)Spring的核心知识尽揽其中
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (已解决)什么是vue导航守卫
  • (转)Linq学习笔记
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .htaccess配置重写url引擎
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NetCore项目nginx发布
  • .NET中GET与SET的用法
  • /etc/shadow字段详解
  • @JsonSerialize注解的使用
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大