工作中使用MP分页时,抛出异常,我的一些解决方案。
1、方法
/**
生成分页对象:
Page<String>:MP的分页对象,泛型类型我直接使用String可以操作,源码中显示为查询结果类型
参数:当前页码,页大小
*/
Page<String> pageInfo = new Page<>(current,size);
/**
进行查询:
Page<Student>:查询结果,会自动进行封装结果集和分页相关参数
Page<String> pageInfo:分页信息
@Param("studentQuery") StudentQuery studentQuery:
1、查询条件
2、注意,sql语句中调用使用#{studentQuery.name}形式,否则会抛出找不到参数异常
*/
Page<Student> queryDrgCostByGroupCodesNew(Page<String> pageInfo,@Param("studentQuery") StudentQuery studentQuery);
2、遇到的问题
问题详情:
即查询时,显示异常信息为‘期待获取为1行,实际获取为XXX行’(具体异常信息忘记截图了)
问题分析:
MP分页插件工作时,会进行两次查询,即使用select count(*)
查询当前总条数,然后才会执行实际sql并拼接分页条件查询。
我在日志中发现,MP进行count(*)
查询时,只会获取sql语句中from
关键字和where
后(包括分组等)相关语句,也就是说,会将部分sql语句忽略掉,如left join ··· on
这类语句,所以导致语意变化,无法查询结果。
而上述问题可能由group by
语句造成,即分组前和分组后count(*)
的差别
问题解决
解决方案1:针对连表操作问题-left join on
使用SQL92的连表方式进行,即from
后面跟多张表并不会被忽略
select table_a.*,table_b.*
from table_a a,table_b b
where a.id = b.a_id
解决方案2:可解决1的问题,也可解决group by
问题
将上一步查询结果作为临时表,再一次进行查询操作,即对MP暴露一个单表操作
select *
from (
业务sql
) t
3、最后
上面这个是我遇到的问题以及我的一些解决方案,我对MP了解也很有限,可能大家有更好的解决方案,也希望大家在评论区赐教。