解决java8 使用stream流导致PageHelper分页数据不正确

文章讲述了在使用PageHelper进行分页时,如果数据需要通过Stream流处理,可能导致总页数计算错误。作者提供了一个名为PagingUtil的工具类,用于手动实现分页,确保在流操作后正确获取总页数。
摘要由CSDN通过智能技术生成

使用pageHelper分页的时候,原理是在查询sql的时候进行limit分页,但是在业务中,查询出来的数据有时候需要使用stream流进行处理,

PageUtils.startPage(pageNum, pageSize);

List<VO> list = transportToolService.listByCondition(dto);

//没有流操作的情况下不会出现分页错误
collect =list.stream().filter().map().collect(Collectors.toList);

return new PageUtils<>(list);

处理后再使用PageInfo封装会导致总页数不正确,需要手动分页。使用下面的工具类解决:

package com.ruoyi.common.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * File: PagingUtil
 * Author:
 * Description: 手动分页(解决流操作分页
 */
public class PagingUtil<T> {

    private  Integer pageNum;

    private  Integer pageSize;

    public  void startPage(int pageNum, int pageSize) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }

    /**
     * 手动分页
     *
     * @param collect 流处理后的集合
     * @return PageUtils<T>
     */
    public PageUtils<T> manualPaging(List<T> collect) {
        List<T> resultList = new ArrayList<>();
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, collect.size());
        for (int i = startIndex; i < endIndex; i++) {
            resultList.add(collect.get(i));
        }
        // 计算总页数
        int totalPages = collect.size() % pageSize == 0 ? collect.size() / pageSize : collect.size() / pageSize + 1;
        // 封装分页结果
        PageUtils<T> utils = new PageUtils<>(collect);
        utils.list = resultList;
        utils.curPage = pageNum;
        utils.pageSize = pageSize;
        utils.totalCount = collect.size();
        utils.totalPages = totalPages;
        return utils;
    }
}

若依自带的分页工具:

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.sql.SqlUtil;

import java.util.List;

/**
 * 分页工具类
 * 
 * @author ruoyi
 */
public class PageUtils<T> extends PageHelper
{

    /**
     * 当前页
     */
    public int curPage;

    /**
     * 每页数量
     */
    public int pageSize;
    /**
     * 总数量
     */
    public int totalCount;
    /**
     * 总页数
     */
    public int totalPages;

    /**
     * 返回集合
     */
    public List<T> list;

    public PageUtils() {

    }

    public PageUtils(List<T> list) {
        PageInfo<T> ePageInfo = new PageInfo(list);
        this.curPage = ePageInfo.getPageNum();
        this.pageSize = ePageInfo.getPageSize();
        this.totalCount = (int) ePageInfo.getTotal();
        this.totalPages = ePageInfo.getPages();
        this.list = ePageInfo.getList();

        //清除上下文
        PageHelper.clearPage();
    }

    /**
     * 设置请求分页数据
     */
    public static void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }
    /**
     * 设置请求分页数据
     */
    public static Page startPage(int pageNum,int pageSize)
    {
       return PageHelper.startPage(pageNum, pageSize);
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage()
    {
        PageHelper.clearPage();
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值