PageHelper 返回list处理之后total等数据显示异常

实际项目中出现过这个问题,下面分两种情况进行处理。

情况一:不进行数据增减,只是进行一些字段处理

// 情况一:对于返回的list进行了一个字段的处理,这时候没有list数量变化
		PageHelper.startPage(currentPage,pageSize);
        List<EmergencyDrillVo> list = emergencyDrillService.getList(emergencyDrill);
        List<EmergencyDrillVo> emergencyDrillVos = list.stream().map(emergencyDrillVo -> {
            if(emergencyDrillVo != null && emergencyDrillVo.getAccident() != null && emergencyDrillVo.getAccident() !=""){
                emergencyDrillVo.setAccidentName(transAccidentType(emergencyDrillVo.getAccident()));
            }
            return emergencyDrillVo;
        }).collect(Collectors.toList());
        PageInfo<EmergencyDrillVo> pageInfo = new PageInfo<>(emergencyDrillVos);
        Result result = (Result) renderSuccess("success");
        result.setData(pageInfo);
        return result;

解决办法:


// 还是把原来的list丢到pageinfo里面去,这时候正确显示total等信息,
//然后多一步把处理后的结果集set到pageinfo的list属性里面
		PageInfo<EmergencyDrillVo> pageInfo = new PageInfo<>(list);
        pageInfo.setList(emergencyDrillVos);

情况二:不仅进行了字段处理,还进行了数据过滤,结果集有数据变化,这时候上面上面因为total的变化不适用,我用一个自定义的pageUtils解决的。

// 情况二:list通过filter过滤处理之后结果集数量有变化
        List<Notice> notices = noticeService.getList(notice);
        List<Notice> list = new ArrayList<>();
        if("mine".equals(role)){
            list = notices.stream().filter(notice1 -> {
                boolean flag = false;
                if(notice1.getNoticMineIds()!=null && notice1.getNoticMineIds()!="" && notice1.getStatus().equals(2)){
                    String[] strs = notice1.getNoticMineIds().split(",");
                    for(String s : strs){
                        if(notice.getMineId()>0 && notice.getMineId()==Integer.parseInt(s)){
                            flag = true;
                        }
                    }
                }
                return flag;
            })
                    .collect(Collectors.toList());

处理办法:

//工具类处理数据
PageInfo<Notice> pageInfo = PageUtils.list2PageInfo(list,currentPage,pageSize);
// 工具类完整代码
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import java.util.LinkedList;
import java.util.List;

/**
 * @author ajq
 * @version 1.0
 * @date 2020/9/25 17:12
 */
public class PageUtils {


        public static <T> PageInfo<T> list2PageInfo(List<T> arrayList, Integer pageNum, Integer pageSize) {
            //实现list分页
            PageHelper.startPage(pageNum, pageSize);
            int pageStart = pageNum == 1 ? 0 : (pageNum - 1) * pageSize;
            int pageEnd = arrayList.size() < pageSize * pageNum ? arrayList.size() : pageSize * pageNum;
            List<T> pageResult = new LinkedList<T>();
            if (arrayList.size() > pageStart) {
                pageResult = arrayList.subList(pageStart, pageEnd);
            }
            PageInfo<T> pageInfo = new PageInfo<T>(pageResult);
            //获取PageInfo其他参数
            pageInfo.setTotal(arrayList.size());
            int endRow = pageInfo.getEndRow() == 0 ? 0 : (pageNum - 1) * pageSize + pageInfo.getEndRow() + 1;
            pageInfo.setEndRow(endRow);
            boolean hasNextPage = arrayList.size() <= pageSize * pageNum ? false : true;
            pageInfo.setHasNextPage(hasNextPage);
            boolean hasPreviousPage = pageNum == 1 ? false : true;
            pageInfo.setHasPreviousPage(hasPreviousPage);
            pageInfo.setIsFirstPage(!hasPreviousPage);
            boolean isLastPage = (arrayList.size() > pageSize * (pageNum - 1) && arrayList.size() <= pageSize * pageNum) ? true : false;
            pageInfo.setIsLastPage(isLastPage);
            int pages = arrayList.size() % pageSize == 0 ? arrayList.size() / pageSize : (arrayList.size() / pageSize) + 1;
            pageInfo.setNavigateLastPage(pages);
            int[] navigatePageNums = new int[pages];
            for (int i = 1; i < pages; i++) {
                navigatePageNums[i - 1] = i;
            }
            pageInfo.setNavigatepageNums(navigatePageNums);
            int nextPage = pageNum < pages ? pageNum + 1 : 0;
            pageInfo.setNextPage(nextPage);
            pageInfo.setPageNum(pageNum);
            pageInfo.setPageSize(pageSize);
            pageInfo.setPages(pages);
            pageInfo.setPrePage(pageNum - 1);
            pageInfo.setSize(pageInfo.getList().size());
            int starRow = arrayList.size() < pageSize * pageNum ? 1 + pageSize * (pageNum - 1) : 0;
            pageInfo.setStartRow(starRow);
            return pageInfo;
        }
    }


根据您提供的引用内容,可以得出分析和回答如下: 引用中提到,使用PageHelper分页后,查询结果集实际上是一个隐藏了其他分页信息的集合。通过创建PageInfo对象来获取该集合中的total。然而,如果对查询结果集进行了二次操作,将其转换成了voList,那么在创建PageInfo对象时,total就会丢失,导致total变为size。所以,这可能是出现total等于pageSize的原因。 为了解决这个问题,可以将原本返回list直接放到service层中,并返回封装好的分页对象,而不是在controller层进行getDataTable的操作。 引用中的PageInfo构造器源码可以看出,如果list是一个Page对象,则直接从该对象中获取pageNum、pageSize、pages和size等分页信息。但如果list是一个Collection对象,则pageNum为1,pageSize为list的大小,pages为1或0,最后的total也是list的大小。 综上所述,通过PageHelper分页获取的total值取决于查询结果集的类型和是否进行了二次操作。在使用PageHelper分页时,可以考虑将查询结果集直接返回给service层,并封装成分页对象返回给controller层,以确保正确获取total值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PageHelper 分页,total总数等于每页数量的问题解决](https://blog.csdn.net/zjuwzp/article/details/101211904)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [若依pageHelper分页导致total错误的问题](https://blog.csdn.net/m0_50707445/article/details/130771964)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值