当前使用版本(必填,否则不予处理)

使用版本:3.4.1

maven依赖 com.baomidou mybatis-plus-boot-starter 3.4.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

当我使用框架的分页功能时,原始sql为: select a.x, b.x, c.x from table1 a left join table2 b on a.id = b.id left join table3 c on c.id = b.id AND a.create_time >= #{params.startTime} AND a.create_time <= #{params.endTime} AND b.order_id = #{params.orderId} order by a.id desc

框架会自动生成查询总数的sql,sql为: SELECT COUNT(*) FROM table1 a WHERE a.create_time >= '2020-12-10 00:00:00' AND a.create_time <= '2020-12-10 23:59:59';

假设table1中有10条符合条件的数据,table2中有20条数据于table1中的10条数据匹配,那么我的原始sql查出来的是20条数据,但是框架自动生成查询总数的sql查询出来的 总数为10

重现步骤(如果有就写完整)

参考 该问题是如何引起的?

报错信息

临时解决办法

在 com.baomidou.mybatisplus.extension.plugins.pagination.Page 对象中有 optimizeCountSql(自动优化 COUNT SQL)属性,默认值为true,将其设置为false可以临时解决这个问题, 但是也会禁用掉MP对sql的自动优化功能。

修改建议

我跟踪框架源码发现在 com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#autoCountSql 这里会生成查询count的sql, 在处理 ”包含 join 连表,进行判断是否移除 join 连表“ 处理时,只是简单的判断了where条件中是否出现了join中的表,如果有就不移除join操作, 建议在 if (CollectionUtils.isNotEmpty(orderBy)) 条件为true时,将 canRemoveJoin 设置为true,这样就解决了我说的问题。

Comment From: miemieYaho

升级设置 optimizeJoin = false