您的位置:首页 > 房产 > 家装 > PageHelper自定义返回类型

PageHelper自定义返回类型

2024/12/23 8:10:50 来源:https://blog.csdn.net/qfxl0724/article/details/139447363  浏览:    关键词: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这种类型,我也不好再换数据结构,不过最终还是解决了自定义返回的问题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com