MybatisPlus分页的一个异常解决

工作中使用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了解也很有限,可能大家有更好的解决方案,也希望大家在评论区赐教。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值