MyBatis分页返回数据不对问题

59 篇文章 2 订阅
5 篇文章 0 订阅

使用mybatis的分页时,一定要注意使用方法。

当表关系为一对多、多对多时,普通直接分页是有问题的,例如:

一个老师有多个学生,假设每个老师有2个学生,一共有15名老师,此时分页查询老师,每页显示10条。然而查询到的结果是:每页老师只有5名,一共有3页。

sql语句:

select * from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? limit 0,10

原因:由于老师与学生是一对多,那么用join语句查询老师时,记录一共实际上是有30条的,每个老师会重复两遍(而学生的数据是不同的),那么分页虽然出来的是10条,然而有一半老师数据是重复的,经mybatis转化成对象后,就是有5个老师(每个老师里有2个学生,共10个学生)。总数由于是30条,那么总页数自然也会算成3页了。

 

那么遇到这种情况怎么办呢?

正确的做法是:分成2条sql语句

sql语句一:select t.id from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? group by t.id limit 0,10

sql语句二:select * from Teacher t inner join Student s on t.id = s.teacher_id where t.id in (?,?,?,?,?,?,?,?,?,?)

第一个sql语句的目的是根据查询条件进行分页查询,通过group by语句对老师进行分组排重。

第二个sql语句的目的是关联查询出满足分页条件的老师id的所有老师及学生的信息。

 

总结:造成分页错误的原因是join的表是多的一端,但由于查询条件中可能会有多的一端的条件,又不得不join关联,因此必须采用group by语句排重,但我们希望通过mybatis将所有对象关系的信息都返回,因此还要发条sql语句关联查询出所有表的信息。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值