若依框架多次list查询时,分页失效

若依框架多次list查询时,分页失效

若依、springboot、mybatis

背景

做大屏页面列表分页,从别处摘来分页的代码,那块明明没问题,我改完却发现不能分页,始终是第1页的状态。

问题描述

从正常分页的代码处摘得分页代码,调用业务层:

controller(ope){
        startPage();
        List<vo> list=oService.get(ope);
        return getDataTable(list);
        }

业务层使用两次查询,第一次使用查询条件获得结果对象的id列表,第二次使用stream流获取结果对象列表并组装返回:
(解释一下为什么这么写,因为实体类有字典名称等信息需要二次查询补充,业务层已经有方法实现单个对象的信息补充了,我不想再复制重复代码了,于是想查询出来后流处理下列表)

service(ope){
        return oMapper.select(ope).stream() // id列表
        .map(this::getVoById).collect(Collectors.toList()) // 根据id获取对象
        }

前端使用分页组件调用接口,发现数据总数total始终与每页大小一样,页数始终是1,这不正常。

问题分析

直觉告诉我,应该是id二次查询导致的问题,第二次查出来的list里边没有查询条件中的总数和页数,出来的对象自然就不正常了,查看getDataTable()
源码,
发现其中设置了结果的total值,是从参数的list对象中获取的,难道,我要手动把业务层返回的list对象设置一下total值吗?

于是我搜索springboot 若依项目使用id列表二次查询导致pageutil分页失效的解决办法
搜到了这么一篇博客
里面说多次查询导致控制层创建的page对象消耗了,需要把开启分页的代码放到业务层查询最终list结果的逻辑前。

然而这种改良方式只适合最后的list对象是从数据库中查询得到的情况,我这是使用stream流产生的,不可能支持那种分页了。

突然想到,别的也有查询之后二次处理(拼接补充信息)的分页,查看代码,发现那些地方最终是返回了初次查询得到的list对象,中间有foreach处理逻辑。

那么,可以借鉴,dao层查询的列表可以使用实体对象来保存id,然后想办法使用循环,依次查询,替换其中的实体对象或者赋值某属性,最终返回这个list就行了

解决方案

  1. dao层调整返回类型,由long列表改为对象列表;

  2. 业务层:

service(ope){
        List<OVo> oVos=oMapper.select(ope); // dao类型由id列表改为对象列表,其实质还是id列表
        oVos.replaceAll(oVo->getVoById(oVo.getId())); // 根据id获取对象,替换列表元素
        return oVos;
        }

这idea的md插件,好像有点bug,格式化代码上有点问题。

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!

若依框架分页查询错误的解决方法是对查询结果集进行二次操作,会导致分页信息丢失。解决方案是将原本返回的List直接放到service层中,封装成分页对象后返回。这样可以避免分页信息丢失的问题。具体代码如下: ```java // 在service层中进行分页查询 @Service public class YourService { @Autowired private YourMapper yourMapper; public PageInfo<YourEntity> getYourPageData(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<YourEntity> yourList = yourMapper.getYourData(); return new PageInfo<>(yourList); } } ``` 这样,在controller层调用service层的方法,就可以得到封装好的分页对象。使用这种方式可以避免使用PageHelper可能出现的问题。123 #### 引用[.reference_title] - *1* *3* [若依分离版——解决配置双数据源oracle,mysql分页错误问题](https://blog.csdn.net/zhaolulu916/article/details/131931766)[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] - *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] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值