PageHelper自定义返回类型

PageHelper的doSelectPageInfo方法自定义返回类型,今天做分页时,使用以下代码:
PageInfo<AdminVo> pageInfo = PageHelper.startPage(
        StringUtils.isNull(page) ? 1 : Integer.parseInt(page),
        StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit))
        .doSelectPageInfo(() -> adminService.getUserAll(userName));

本来看是没问题的,前端也没有说,但是我发现返回的数据竟然不是AdminVo,而是Admin实体类。问题就来了, 我不断打断点进行调试,发现不了问题,于是尝试其他方法。

下面的尝试就是把ServantRank对象转为ServantRankVo。

方法一:

List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(
        jsonObject.getString("userName"),
        jsonObject.getString("cardId"), 
        jsonObject.getString("unitPosition"), 
        jsonObject.getString("leadershipPosition"));
PageInfo<ServantRankVo> pageInfo = new PageInfo<>();
pageInfo.setPageNum(StringUtils.isNull(page) ? 1 : Integer.parseInt(page));
pageInfo.setPageSize(StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));
pageInfo1.setList(servantRankAll);

数据体没问题,内容也正确,但是个别字段不是自动算出来的,需要自己计算并set。

方法二:

PageHelper.startPage(StringUtils.isNull(page) ? 1 : Integer.parseInt(page),
        StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));

List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(
        jsonObject.getString("userName"),
        jsonObject.getString("cardId"), 
        jsonObject.getString("unitPosition"), 
        jsonObject.getString("leadershipPosition"));
PageInfo<ServantRankVo> pageInfo = new PageInfo<>(servantRankAll);

返回的仍然是ServantRank。

我开始看PageHelper的方法实现,于是设置完基础数据后得到一个Page<>对象。

接下来Page转PageInfo,这个简单啊,但是写完发现转完之后的内容有一半是ServantRank,一半是ServantRankVo。很纳闷,为什么会复制一份再转,于是继续打断点调试,最后直接清空再转。

这个是最终的代码:

Page<ServantRankVo> pageObj = PageHelper.startPage(StringUtils.isNull(page) ? 1 : Integer.parseInt(page),
                                                    StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));
List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(
        jsonObject.getString("userName"),
        jsonObject.getString("cardId"),
        jsonObject.getString("unitPosition"),
        jsonObject.getString("leadershipPosition"));
pageObj.clear();
pageObj.addAll(servantRankAll);
PageInfo<ServantRankVo> pageInfo = new PageInfo<>(pageObj);

上述如果不调用pageObj.clear();  会有两份数据,就是一半是ServantRank,一半是ServantRankVo。

先把pageObj清空,调用clear();当然你会发现不是调用的removeAll(),并且removeAll()还要让你传参数, 很纳闷removeAll()方法为什么要传参吧。可以了解一下ArrayList的removeAll()和clear()方法的区别。

于是再调用pageObj.addAll(servantRankAll);把结果集复制,最后再转,问题解决。

但是我又发现返回的PageInfo的pages参数不对,虽然前端用不到,但是抱着精益求精的想法,我就自行计算一下填入。

pageObj.setPages(total % pageSize == 0 ? total / pageSize : total / pageSize + 1);

终于写完了,但是,代码很臃肿,不利于维护阅读,更何况如果service业务较多,这块就得抽出了,那就写个工具类,方便后续其他地方也可以调用自定义参数分页。

public class PageUtils {

    private static final int PAGE_NUM = 1;

    private static final int PAGE_SIZE = 10;

    public static <T> PageInfo<T> getPageInfo(String page, String limit, List<T> list) {
        int total = list.size();
        int pageNum = StringUtils.isNull(page) ? PAGE_NUM : Integer.parseInt(page);
        int pageSize = StringUtils.isNull(limit) ? PAGE_SIZE : Integer.parseInt(limit);

        // 如果数据为空,则直接返回
        if (total == 0) {
            return new PageInfo<T>();
        }
        pageNum = pageNum == 0 ? PAGE_NUM : pageNum;
        pageSize = pageSize == 0 ? PAGE_SIZE : pageSize;

        // 初始化Page对象
        Page<T> pageObj = PageHelper.startPage(pageNum, pageSize);
        pageObj.clear();
        pageObj.addAll(list);
        pageObj.setTotal(total);
        pageObj.setPages(total % pageSize == 0 ? total / pageSize : total / pageSize + 1);

        return new PageInfo<T>(pageObj);
    }


}

这个工具类优化了三次,最后是这样。其中初始化Page对象时如果前端有其他字段需求则需要自己根据情况初始化。

至此这个问题总算是解决,尝试了很多办法,前端一直都是用的PageInfo这种类型,我也不好再换数据结构,不过最终还是解决了自定义返回的问题。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风亦思雨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值