使用Mybatis-plus分页查询的Total与实际条数不对应

文章讨论了在使用Mybatis-Plus进行多表关联查询时,由于自动优化导致的查询SQL不一致问题。解决方法是关闭分页查询的优化功能。作者提供了关闭`optimizeCountSql`的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象

对于单表查询是没有问题的。而需要多表关联查询(自写sql)时,就会查询调用Mybatis-Plus的.page(Page page,Wrapper queryWrapper);

可以看到后台实际执行sql有两个。
一个是查询sql的数据:

select
        visit.id as id,
        visit.rfid_card_num as rfidCardNum,
        cp.id as bizClinicalPathId,
        users.nickname as nickName
        from  ecqm_biz_patient_visit visit
        left join ecqm_biz_clinical_path  cp 
         	on  visit.id = cp.pv_id and cp.deleted  = 0
        left join system_users users 
        	on users.id = visit.creator and users.deleted = 0
        WHERE visit .deleted = 0

另一个为统计Total数量的sql;
但是查询total的语句却是:

select count(*) from  ecqm_biz_patient_visit visit 
where visit .deleted = 0

显然是有问题的;

原因

这是因为对查询进行了优化(只查主表符合查询条件的总条数),这就导致两条查询sql的表数量不一致,从而导致查询总条数不一致的情况。

com.baomidou.mybatisplus.extension.plugins.pagination.Page源码:

    /**
     * 自动优化 COUNT SQL
     */
    protected boolean optimizeCountSql = true;
    /**
     * 是否进行 count 查询
     */
    protected boolean searchCount = true;
	
	......其他源码省略
	
	public Page<T> setOptimizeCountSql(boolean optimizeCountSql) {
        this.optimizeCountSql = optimizeCountSql;
        return this;
    }

解决方案

关闭分页查询优化即可: page.setOptimizeCountSql(false)。

Page<BizPatientVisitRespVO> page = new Page<>(pageReqVO.getPageNo(),pageReqVO.getPageSize());
//关闭分页查询优化
page.setOptimizeCountSql(false);
Page<VO> result = bizPatientVisitMapper.getInPatient(page,pageReqVO );
return new PageResult<>(result.getRecords(), result.getTotal());
### MyBatisPlus 分页查询获取 PageInfo 示例 在使用 MyBatis-Plus 进行分页查询时,可以通过 `Page` 类来实现页功能。为了进一步处理页后的数据并获得详细的页信息,可以借助 `PageInfo` 对象[^2]。 #### 创建页对象 首先创建一个 `Page<T>` 对象用于封装页参数: ```java // 假设 T 代表实体类类型, current 表示当前页码, size 表示每页显示记录数 Page<T> page = new Page<>(current, size); ``` #### 执行分页查询 接着调用 Mapper 接口中的方法执行带有页条件的查询操作: ```java IPage<T> iPage = yourMapper.selectPage(page, null); // 如果有额外查询条件可放入 Wrapper 中作为第二个参数 ``` 这里返回的是实现了 IPage 接口的对象实例,它仅包含了查询到的数据列表还携带有关于总条目数量等其他有用的信息。 #### 将结果转换为 PageInfo 由于 MyBatis-Plus 返回的结果已经包含了足够的页信息,可以直接利用这些属性构建 `PageInfo` 实例: ```java import com.github.pagehelper.PageInfo; List<T> records = iPage.getRecords(); long total = iPage.getTotal(); PageInfo<T> pageInfo = new PageInfo<>(records); pageInfo.setTotal(total); System.out.println("总记录数:" + pageInfo.getTotal()); System.out.println("第几页:" + pageInfo.getPageNum()); System.out.println("页面大小:" + pageInfo.getPageSize()); System.out.println("是否有下一页:" + pageInfo.isHasNextPage()); ``` 上述代码片段展示了如何基于 MyBatis-Plus 查询得到的结果集初始化 `PageInfo` 并访问其中的一些常用字段[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

strggle_bin

一毛不嫌少,十元不嫌多

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

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

打赏作者

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

抵扣说明:

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

余额充值