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

解决ruoyi框架中使用pagehelper插件分页查询后对数据进行对象转换后失效问题

一、场景重现

使用rouyi框架时,可以看到很多分页查询,如:

//-----------SysConfigController-------------
@GetMapping("/list")
public TableDataInfo list(SysConfig config) {
   startPage();
   List<SysConfig> list = configService.selectConfigList(config);
   return getDataTable(list);
}

//-----------SysConfigServiceImpl-------------
@Override
public List<SysConfig> selectConfigList(SysConfig config) {
    return configMapper.selectConfigList(config);
}

这里的分页就是使用pagehelper,很方便易用。
但如果需要将对象进行转换时,分页会失效,如:

//---------OrderController------------
@GetMapping("/list")
public TableDataInfo list(OrderDTO dto) {
   startPage();
   List<OrderDTO> list = orderService.selectOrderList(dto);
   return getDataTable(list);
}

//---------OrderServiceImpl------------
@Override
public List<OrderDTO> selectOrderList(OrderDTO dto) {
   List<OrderDO> list = orderMapper.selectOrderList(dto);
   return list.stream().map(OrderDO::toDTO).collect(Collectors.toList());
}

此时会丢失total属性,导致无法正常分页。

二、方案一

请看代码:

//---------OrderController------------
@GetMapping("/list")
public TableDataInfo list(OrderDTO dto) {
   startPage();
   List<OrderDO> list = orderService.selectOrderList(dto);
   Page<OrderDTO> page = new Page<>();
   //赋值 pageSize、pageNum、total
   BeanUtils.copyProperties(list, page);
   page.clear();
   list.stream().map(OrderDO::toDTO).forEach(page::add);
   //或 list.forEach(item->page.add(item.toDTO()));
   //或 page.addAll(list.stream().map(OrderDO::toDTO).collect(Collectors.toList()));
   return getDataTable(page);
}

//---------OrderServiceImpl------------
@Override
public List<OrderDO> selectOrderList(OrderDTO dto) {
   return orderMapper.selectOrderList(dto);
}

上面的代码可以简化一下,先抽离公共部分

protected <T, R> Page<R> converter(List<T> list, Function<T, R> converter) {
    Page<R> page = new Page<>();
    BeanUtils.copyProperties(list, page);
    page.clear();
    list.stream().map(converter).forEach(page::add);
    return page;
}

再进行改造

//---------OrderController------------
@GetMapping("/list")
public TableDataInfo list(OrderDTO dto) {
   startPage();
   List<OrderDO> list = orderService.selectOrderList(dto);
   Page<OrderDTO> page = converter(list, OrderDO::toDTO);
   return getDataTable(page);
}

Page类继承了ArrayList,看源码

package com.github.pagehelper;

import ... ...

public class Page<E> extends ArrayList<E> implements Closeable {
 ... ...
}

所以可以直接使用BaseController中的getDataTable方法

//----------BaseController-------------
protected TableDataInfo getDataTable(List<?> list) {
   TableDataInfo rspData = new TableDataInfo();
   rspData.setCode(HttpStatus.SUCCESS);
   rspData.setRows(list);
   rspData.setMsg("查询成功");
   rspData.setTotal(new PageInfo(list).getTotal());
   return rspData;
}

也可以自己重载一下该方法

protected TableDataInfo convertDataTable(Page<?> page) {
   TableDataInfo rspData = new TableDataInfo();
   rspData.setCode(HttpStatus.SUCCESS);
   rspData.setRows(page.getResult());
   rspData.setMsg("查询成功");
   rspData.setTotal(page.getTotal());
   return rspData;
}

三、方案二

还有另外一种方案,与这个大差不差,就是自定义一个分页类

import lombok.Data;
import java.util.List;

@Data
public class PageResult<T> {
    //状态码 0:成功 其他:失败
    private Integer code = 0;
    //页码
    private int pageNum;
    //分页大小
    private int pageSize;
    //总数
    private long total;
    //返回数据
    private List<T> data;

	//构造函数
    public PageResult(Integer code, PageLink pageLink, List<T> data) {
        this.code = code;
        this.pageNum = pageLink.getPageNum();
        this.pageSize = pageLink.getPageSize();
        this.total= pageLink.getTotal();
        this.data = data;
    }

    public static <T> PageResult success(PageLink pageLink, List<T> data) {
        return new PageResult<>(ResponseCode.OK, pageLink, data);
    }
}

接收前端的分页传值

@Data
public class PageLink {
    private int pageNum = 1;
    private int pageSize = 10;
    private long total;
}
//---------OrderController------------
@GetMapping(value = "/list")
public PageResult<OrderDTO> list(OrderDTO dto, PageLink pageLink) {
    List<OrderDTO> list = orderService.selectOrderList(dto, pageLink);
    return PageResult.success(pageLink, list);
}

//---------OrderServiceImpl------------
@Override
public List<OrderDTO> selectOrderList(OrderDTO dto, PageLink pageLink) {
    // 分页查询
    PageInfo<OrderDO> pageInfo = PageHelper.startPage(pageLink.getPageNum(), pageLink.getPageSize()).doSelectPageInfo(() -> orderMapper.selectOrderList(dto));
    pageLink.setTotal(pageInfo.getTotal());
    
    return pageInfo.getList().stream().map(OrderDO::toDTO).collect(Collectors.toList());
}

http://www.kler.cn/news/295122.html

相关文章:

  • 24程序员转行,首选为什么是它?
  • 深度学习TensorFlow框架
  • 分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节
  • 场外个股期权雪球结构期权产品原理
  • Linux 使用rsync拷贝文件
  • 【Linux】读者写者问题与读写锁
  • 探索大语言模型在心理健康状态评估的应用
  • 【线性代数】正定矩阵,二次型函数
  • IOS 21 发现界面(UITableView)单曲列表(UITableView)实现
  • Java项目: 基于SpringBoot+mybatis+maven学科竞赛管理系统(含源码+数据库+毕业论文)
  • 0x06 记录一次挖src的经历(xss漏洞)
  • 【机器人工具箱Robotics Toolbox开发笔记(十六)】SCARA机器人关节空间轨迹规划仿真实例
  • 分类与回归的区别
  • JavaScript 根据关键字匹配数组项
  • C++(一)----C++基础
  • Linux中的Vim文本编辑器
  • 【Spring】获取cookie,session,header(3)
  • 有限体积法:基于一维稳态扩散问题及其程序实现
  • sping boot 基于 RESTful 风格,模拟增删改查操作
  • 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)
  • 使用LSTM(长短期记忆网络)模型预测股票价格的实例分析
  • 复旦大学王龑团队发布《静态与动态情感的面部表情识别》综述
  • 漫谈设计模式 [5]:建造者模式
  • 通用内存快照裁剪压缩库Tailor介绍及源码分析(一)
  • ubuntu安装maven
  • C++可以被重载的操作符Overloadable operators
  • SpringBoot 依赖之 Spring for RabbitMQ
  • LabVIEW如何确保采集卡稳定运行
  • 基于SSM+Vue+MySQL的可视化高校公寓管理系统
  • 【Qt笔记】QUndoView控件详解