• 若依框架以及Mybatis-plus分页插件失效,数据库有多条却只查前十条


            最近在若依的基础上开发,因为若依自带分页所以一直就没考虑数据分页,最近发现数据库明明有数据,却只能查出前10条。

     首先分析原因,我是在原来代码的基础上,重新封装了vo类返回给前端,导致的分页失效,首先看若依的分页源码是采用startPage()、getDataTable()两个方法对数据进行分页。

    1. /**
    2. * 设置请求分页数据
    3. */
    4. protected void startPage()
    5. {
    6. PageDomain pageDomain = TableSupport.buildPageRequest();
    7. Integer pageNum = pageDomain.getPageNum();
    8. Integer pageSize = pageDomain.getPageSize();
    9. if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
    10. {
    11. String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
    12. PageHelper.startPage(pageNum, pageSize, orderBy);
    13. }
    14. }
    15. /**
    16. * 响应请求分页数据
    17. */
    18. @SuppressWarnings({ "rawtypes", "unchecked" })
    19. protected TableDataInfo getDataTable(List<?> list)
    20. {
    21. TableDataInfo rspData = new TableDataInfo();
    22. rspData.setCode(HttpStatus.SUCCESS);
    23. rspData.setMsg("查询成功");
    24. rspData.setRows(list);
    25. rspData.setTotal(new PageInfo(list).getTotal());
    26. return rspData;
    27. }

            再看下自己的代码就发现分页是对原有基础的代码进行分页操作,而我重新封装的vo类,代码中并没有对其进行分页,而是走了默认的10条数据。

    mybatis中解决方式:

            由于若依默认用的是mybatis,先说下mybatis的解决方法,因为之前返回给前端的不是第一次查出来的数据,而是遍历又封装了一个集合返回的,所以我觉定修改查询方式,在查询时对封装的vo类进行查询,因为原有方法的数据列vo类中都存在,所以只需要修改xml文件添加方法即可,查询出来之后,再把需要自己处理的值放进去就可以保证返回的数据是第一次分页的数据。

    控制层:创建新的方法

    1. @GetMapping("/list")
    2. public TableDataInfo list(Commodity commodity)
    3. {
    4. startPage();
    5. // List<Commodity> list = commodityService.selectCommodityList(commodity);
    6. List<CommodityVo> list =commodityService.selectVoList(commodity);
    7. return getDataTable(list);
    8. }

    在xml文件中重新定义resultMap,作为查询vo类的标志,里面的映射跟原有一样即可(查询出来的数据跟原有一样)

    1. <resultMap type="CommodityVo" id="CommodityResultVo">
    2. <result property="id" column="id" />
    3. ....
    4. <result property="spzt" column="spzt" />
    5. </resultMap>

    对应方法

    1. <select id="selectList" parameterType="Commodity" resultMap="CommodityResultVo">
    2. <include refid="selectCommodityVo"/>
    3. <where>
    4. <if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
    5. ...
    6. </where>
    7. </select>

    这样查出来的数据类型就是之前我们封装好的vo类的类型,从而在查出来时,我们可以处理自己的业务逻辑,并将自己需要的字段值set进去,从而解决分页失效的问题。

    1. @Override
    2. public List<CommodityVo> selectVoList(Commodity commodity) {
    3. List<CommodityVo> vos = commodityMapper.selectList(commodity);
    4. for (int i = 0; i < vos.size(); i++) {
    5. DsxsSpMoney dsxsSpMoney = new DsxsSpMoney();
    6. dsxsSpMoney.setSpid(vos.get(i).getId());
    7. List<DsxsSpMoney> dsxsSpMonies = spMoneyMapper.selectDsxsSpMoneyList(dsxsSpMoney);
    8. vos.get(i).setSpmoneyList(dsxsSpMonies);
    9. }
    10. return vos;
    11. }

    Mybatis-plus分页解决办法:

           这里我用的思路都是一样的,就是查询时候自己定义多出来的数据列,查询出来之后,在将需要的数据set进去。

    首先引用mybatis-plus自带的分页插件

    1. @Configuration
    2. @MapperScan("com.lzq")
    3. @EnableTransactionManagement
    4. public class HospConfig {
    5. /**
    6. * 分页插件
    7. */
    8. @Bean
    9. public PaginationInterceptor paginationInterceptor() {
    10. return new PaginationInterceptor();
    11. }
    12. }

    重新定义实体类:使用@TableField(exist = false)注解定义数据库中不存在的类型

    1. public class Commodity implements Serializable {
    2. private static final long serialVersionUID=1L;
    3. //原有的实体类
    4. private Integer id;
    5. ...
    6. //数据库中不存在的类型
    7. @TableField(exist = false)
    8. private List<String> detials;
    9. @TableField(exist = false)
    10. private List<String> pics;
    11. @TableField(exist = false)
    12. private List<String> colors;
    13. @TableField(exist = false)
    14. private List<DsxsSpMoney> jglist;
    15. }

    接下来需要前端传入查询条件、页码、每页记录数来进行查询,编写控制层方法

    1. @GetMapping("getCommodity")
    2. public R getCompanyList(Commodity commodity,Long page,Long limit){
    3. Page<Commodity> pageParam = new Page<>(page, limit);
    4. QueryWrapper<Commodity> wrapper = new QueryWrapper<>();
    5. if (commodity.getName()!=null){
    6. wrapper.like("name", commodity.getName());
    7. }
    8. if (commodity.getType()!=null){
    9. wrapper.eq("type",commodity.getType());
    10. }
    11. commodityService.page(pageParam,wrapper);
    12. List<Commodity> list = pageParam.getRecords();
    13. for (int i = 0; i < list.size(); i++) {
    14. if (list.get(i).getPic()!=null){
    15. String[] split = list.get(i).getPic().split(",");
    16. ArrayList<String> arrayList = new ArrayList<>();
    17. for (String pics:split) {
    18. arrayList.add(pics);
    19. }
    20. list.get(i).setPics(arrayList);
    21. }
    22. if (list.get(i).getDetial()!=null){
    23. ...
    24. }
    25. if (list.get(i).getColor()!=null){
    26. ...
    27. }
    28. ...
    29. }
    30. long total = pageParam.getTotal();
    31. return R.ok().data("list",list).data("total",total);
    32. }

    返回给前端数据以及总记录数。

  • 相关阅读:
    Matlab:神经网络实现手写数字识别
    探讨Java多线程调度:如何实现两线程并行,一线程等待?
    Maven基础概念及配置
    遥遥领先的内存函数
    开发Chrome插件,实现网站自动登录
    第三章 内存管理 十三、页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、时钟置换算法、改进型的时钟置换算法)
    最详细STM32,cubeMX 按键点亮 led
    从零开始:PRD产品需求文档怎么写
    取证基础——MongoDB数据库基础
    devops步骤 -- jenkins安装
  • 原文地址:https://blog.csdn.net/weixin_52210557/article/details/125629674