当前使用版本(必填,否则不予处理)
使用版本:3.4.1
maven依赖
该问题是如何引起的?(确定最新版也有问题再提!!!)
当我使用框架的分页功能时,原始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
b.order_id = #{params.orderId}
框架会自动生成查询总数的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