Solve the problem of PageHelper version mismatch and all results may be returned

1. Question:

Using pagehelper, if it does not match the mybatis version, there will be an error in the return result. For example: I originally wanted to return the data of pageNum: 1, pageSize: 1, but all of them are returned. If there is no problem with your own code, the most likely problem is version mismatch.

2.Solution:

This problem is likely due to version mismatch. You can use the following version for testing. I tested it successfully.

<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.1</version>
        </dependency>

3. Pagehelper usage examples are as follows:

You can see that when using it, you only need the pagehelper.startPage method; then just put the return list in the new Page.

3.1.server impl layer

 @Override
    public PageInfo listForAdmin(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize, "type, order_num");
        List<Category> categoryList = categoryMapper.selectList();
        PageInfo pageInfo = new PageInfo(categoryList);
        return pageInfo;
    }

3.2.service layer 

PageInfo listForAdmin(Integer pageNum, Integer pageSize);

3.3.controller layer

@ApiOperation("后台目录列表")
    @GetMapping("admin/category/list")
    @ResponseBody
    public ApiRestResponse listCategoryForAdmin(@RequestParam Integer pageNum,
            @RequestParam Integer pageSize) {
        PageInfo pageInfo = categoryService.listForAdmin(pageNum, pageSize);
        return ApiRestResponse.success(pageInfo);
    }

Hope this helps, thank you!

---------------------------------------------------------------------------------------------------------------------------------

I saw a good pagehelper question, recorded here to avoid encountering the same problem next time:

The more you know, the more you don’t know. Amateurs are like grass!

The road to success is not crowded because there are not many people who persist.

Editor: Amateur Grass

blog.csdn.net/qq_35080796

Recommended: https://www.xttblog.com/?p=5184

1. Question

1.1.PageHelper first turns on paging and then operates on the list data.

@Override

    public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {

        PageHelper.startPage(pageNo,pageSize);

        List<HdQueryVo> hdQueryVosByView = actionMapper.getActionByView();


        List<HdQueryVo> hdQueryVos = new ArrayList<>();


        for (HdQueryVo hdQueryVo : hdQueryVosByView) {

            HdQueryVo hdQueryVoSingle = new HdQueryVo();

            hdQueryVoSingle.setHdId(hdQueryVo.getHdId());

            hdQueryVoSingle.setHdType(hdQueryVo.getHdType());

            hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());

            hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());

            hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());

            hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());

            hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());

            hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());

            hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());

            hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());

            hdQueryVoSingle.setUserId(hdQueryVo.getUserId());

            if (hdQueryVo.getHdType().equals(0)) {

                hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));

            } else {

                hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));

            }

            hdQueryVos.add(hdQueryVoSingle);

        }

        PageInfo<HdQueryVo> pageViewInfo = new PageInfo<>(hdQueryVos);


        return pageViewInfo;

    }

Paging is possible, but the amount of data is wrong. total is always equal to the amount of data per page, which is pageSize.

1.2. First operate the list data, and then enable paging.

@Override

    public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {

        

        List<HdQueryVo> hdQueryVosByView = actionMapper.getActionByView();


        List<HdQueryVo> hdQueryVos = new ArrayList<>();


        for (HdQueryVo hdQueryVo : hdQueryVosByView) {

            HdQueryVo hdQueryVoSingle = new HdQueryVo();

            hdQueryVoSingle.setHdId(hdQueryVo.getHdId());

            hdQueryVoSingle.setHdType(hdQueryVo.getHdType());

            hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());

            hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());

            hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());

            hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());

            hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());

            hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());

            hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());

            hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());

            hdQueryVoSingle.setUserId(hdQueryVo.getUserId());

            if (hdQueryVo.getHdType().equals(0)) {

                hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));

            } else {

                hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));

            }

            hdQueryVos.add(hdQueryVoSingle);

        }

        PageHelper.startPage(pageNo,pageSize);

        PageInfo<HdQueryVo> pageViewInfo = new PageInfo<>(hdQueryVos);


        return pageViewInfo;

    }

​​​​​​​

The data can be queried and the total total is correct, but the paging function is invalid.

2. Reason (the most important part)

The startPage method of starting paging in PageHelper only works on subsequent sql queries.

1.1 The cause of the error is that after paging is turned on in advance, the list is operated, that is,PageInfo pageViewInfo = new PageInfo<>(hdQueryVos);

/**

* 包装Page对象

*

* @param list

*/

public PageInfo(List list) {

this(list, 8);

}

​​​​​​​

It just converts the list into a PageInfo object and does not affect the previous paging data operation.

1.2 The reason for the error is that after operating the list first, there is no SQL statement after turning on the page.

That is, the sql statement does not participate in paging queries

3.Solution

Directly operate on the data in the paged PageInfo object

  • For list collection operations, first remove the list collection data in PageInfo, and then perform related operations on the data.

  • Save the list collection after the operation to PageInfo again and perform return

 
 
@Override

    public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {

        PageInfo<HdQueryVo> source = PageHelper.startPage(pageNo, pageSize).doSelectPageInfo(()->{

            actionMapper.getActionByView();

        });

        // 需要转换的对象

        PageInfo<HdQueryVo> target = new PageInfo<>();

        // 复制分页属性

        BeanUtils.copyProperties(source, target);

        // 对查询的list进行下一步操作,比如类型转换后

        List<HdQueryVo> collect = source.getList().stream().collect(Collectors.toList());

        List<HdQueryVo> hdQueryVos = new ArrayList<>();


        for (HdQueryVo hdQueryVo : collect) {

            HdQueryVo hdQueryVoSingle = new HdQueryVo();

            hdQueryVoSingle.setHdId(hdQueryVo.getHdId());

            hdQueryVoSingle.setHdType(hdQueryVo.getHdType());

            hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());

            hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());

            hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());

            hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());

            hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());

            hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());

            hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());

            hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());

            hdQueryVoSingle.setUserId(hdQueryVo.getUserId());

            if (hdQueryVo.getHdType().equals(0)) {

                hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));

            } else {

                hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));

            }

            hdQueryVos.add(hdQueryVoSingle);

        }

        // 加工后的数据放入新的pageinfo

        target.setList(hdQueryVos);


        return target;

    }

​​​​​​​  

The problem may not seem complicated, but junior and intermediate programmers are basically at a loss when encountering it. If you don’t know how to read the source code and don’t know how to delve into it, you will always only stay on CRUD. At most, you can only get started.

References:

  • PageHelper official documentation: apidoc.gitee.com/free/Mybatis_PageHelper

  • How to operate the data List after PageHelper paging query results

Guess you like

Origin blog.csdn.net/qq_35207086/article/details/128414185