添加分页功能时PageInfo返回错误的pages,分页不生效

        今天在给别人的查询接口添加分页功能时,发现PageInfo的分页功能失效,pages总是为1,且total值等于当前页面的数据值,不能正确返回数据总数。

这是返回数据错误代码:

public CommonRspVo listCpmDepartmentInfo(String counterpartyName,int pageNo, int pageSize) {
        List<CpmDepartmentInfoVo> list = new ArrayList<>();
        //查询资金对手部门信息放到map 用counterpartyId做key便于组装树取值
        List<CpmDepartmentInfo> cpmDepartmentInfos = cpmDepartmentInfoDao.listByCounterpartyName(counterpartyName);
        Map<Long, List<CpmDepartmentInfo>> cpmDepartmentInfoMap = cpmDepartmentInfos.stream()
                .filter(cpmDepartmentInfo -> cpmDepartmentInfo.getCounterpartyId() != null)
                .collect(Collectors.groupingBy(CpmDepartmentInfoKey::getCounterpartyId));
        //查询交易对手,组装树
        PageHelper.startPage(pageNo,pageSize);
        List<CpmCounterpartyInfo> mapLists = cpmDepartmentInfoDao.selectCounterPartyName(counterpartyName);
        mapLists.forEach(maps -> {
            CpmDepartmentInfoVo cpmDepartmentInfoVo = new CpmDepartmentInfoVo();
            cpmDepartmentInfoVo.setCounterpartyId(maps.getCounterpartyId().toString());
            cpmDepartmentInfoVo.setCounterpartyName(maps.getCounterpartyName());
            cpmDepartmentInfoVo.setParentId("0");
            cpmDepartmentInfoVo.setChildren(cpmDepartmentInfoMap.get(Long.parseLong(maps.getCounterpartyId().toString())));
            list.add(cpmDepartmentInfoVo);
        });
        PageInfo<CpmDepartmentInfoVo> pageInfo = new PageInfo<>(list);
        return ResponseUtil.ok(pageInfo);
    }

对比了之前写过的分页方法,发现并没有缺少语句,page相关的依赖也正确引入了。代码层面上找不到原因,于是去查看源码,在查看PageInfo构造器源码时,发现了其中的问题,由于返回数据是自己封装的Vo,所以只截取相关的源码,如下:

} else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();

            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }

问题就在这里了, PageHelper.startPage(pageNo,pageSize)这段代码只对它之后首次出现的查询语句生效,即mapLists。后面的pageInfo的传参是list,这里的list跟page封装的分页方法已经完全没有关系了,所以有问题。解决方法如下:

 List<CpmDepartmentInfoVo> list = new ArrayList<>();
        //查询资金对手部门信息放到map 用counterpartyId做key便于组装树取值
        List<CpmDepartmentInfo> cpmDepartmentInfos = cpmDepartmentInfoDao.listByCounterpartyName(counterpartyName);
        Map<Long, List<CpmDepartmentInfo>> cpmDepartmentInfoMap = cpmDepartmentInfos.stream()
                .filter(cpmDepartmentInfo -> cpmDepartmentInfo.getCounterpartyId() != null)
                .collect(Collectors.groupingBy(CpmDepartmentInfoKey::getCounterpartyId));

        //查询交易对手,组装树
        PageHelper.startPage(pageNo,pageSize);
        List<CpmCounterpartyInfo> mapLists = cpmDepartmentInfoDao.selectCounterPartyName(counterpartyName);
        PageInfo<CpmCounterpartyInfo> pageInfo = new PageInfo<>(mapLists);
        mapLists.forEach(maps -> {
            CpmDepartmentInfoVo cpmDepartmentInfoVo = new CpmDepartmentInfoVo();
            cpmDepartmentInfoVo.setCounterpartyId(maps.getCounterpartyId().toString());
            cpmDepartmentInfoVo.setCounterpartyName(maps.getCounterpartyName());
            cpmDepartmentInfoVo.setParentId("0");
            cpmDepartmentInfoVo.setChildren(cpmDepartmentInfoMap.get(Long.parseLong(maps.getCounterpartyId().toString())));
            list.add(cpmDepartmentInfoVo);
        });
        PageInfo<CpmDepartmentInfoVo> page = new PageInfo<>(list);
        BeanUtils.copyProperties(pageInfo,page,new String[]{"list"});
        return ResponseUtil.ok(page);

BTW,copyProperties方法要在传参里加上要忽略替换的对象,即list,不然的话会把list中的数据也替换掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PageHelper是MyBatis中一个常用的分页插件,它能简化分页查询的操作,但有候可能遇到分页查询没有生效的情况。这可能是由以下几个原因导致的: 1. **未正确配置**:确保PageHelper在MyBatis的全局配置文件(如mybatis-config.xml或application.properties)中正确配置了。例如,添加了`<plugins>`标签,并在其中启用`pageHelper`插件。 ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="reasonable" value="true"/> <property name="supportMethodsArguments" value="true"/> <property name="params" value="count,offset,pagesize"/> </plugin> </plugins> ``` 2. **注入问题**:PageHelper拦截器没有被正确地注入到Mapper接口的方法上。确保在Mapper接口的方法签名中添加`@PageInfo`注解。 ```java @Mapper public interface UserMapper { List<User> list(@PageParam("params") PageInfo params); } ``` 3. **参数传递错误**:如果你直接在方法中传入PageInfo对象,检查参数是否设置正确,比如`params = new PageInfo<>(params)`。 4. **数据库连接问题**:确认连接数据库的线程池和事务管理设置正常,不会影响分页查询。 5. **代码逻辑问题**:在调用分页查询方法,确认是否有其他代码干扰了PageHelper的行为,比如手动设置了偏移量或限制量等。 如果以上都检查过了还是没有效果,你可以尝试提供更详细的错误日志或者代码片段,这样有助于定位问题。接下来的一些相关问题可能对你有帮助:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值