mybatis分页插件。左连接,一对多查询时分页失效

前言

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查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值