前言
pageHelper是一款优秀的Mybatis分页插件,在项目中可以非常便利的使用,使开发效率得到很大的提升,但不支持一对多结果映射的分页查询,所以在平时的使用时,对于一对多分页会出现分页错误,这篇文章主要对pageHelper分页错误进行重现以及提出解决方案。
分析
mybatis进行一对多查询时,映射文件(mapper.xml)中的sql语句中使用的左连接,pageHelper会自动对这条左连接sql语句进行select count(0)的处理,并把结果作为分页结构的记录总数,然后自动将limit拼接到sql语句末尾进行分页,由于左连接查询时,连接条件on条件不唯一(即一对多)时,结果会产生笛卡尔积,所以经过pagehelper插件分页得到的记录总数和分页结果并不是预期的结果。
解决方案
一、没有右表字段作为查询条件作为筛选时
1、先对左表进行分页查询,之后将查询结果遍历根据条件去查询出对应右表的多条信息
实现简单但是会多次进行数据库查询
2、左连接改成子查询
缺点同1
3、自定义分页查询,先对左进行分页,并把分页结果作为虚拟表与右边进行左连接查询
sql如下,
select * from (select * from sys_user limit 1) a LEFT JOIN sys_role_user on a.id = sys_role_user.user_id
性能比1、2好
二、有右表字段作为查询条件作为筛选时
如果右表有查询条件时,这时候左右表就是一对一关系了,直接用插件,如果还不是就得怀疑需求是否合理或者设计是否合理了
结论
查询数据库前做判断,判断是否有右表字段作为查询条件,有则直接用Mybatis分页插件查询,如果没有就用方案3查询