mybatis包含一对多的分页查询问题

在业务中,有时需要使用 left join 进行联表查询,并且需要用手动进行 limit 分页查询,可mybatis是先分页查询后映射数据结构,比如需要分10条记录一页时,数据库查出的 10 条结果在经过 mybaits 映射结果后返回到前端的记录可能没有 10 条,而导致前端页面显示不正常。这是因为 mybatis 帮我们把左表相同的记录映射到同一对象,而右表多条记录则映射到了集合中,那么怎么能确保左表不相同的记录是10条呢?

方法一(collection select)

第一种方法可以使用子查询映射的方式,但缺点是会产生多条 sql 语句,造成性能下降
如下图,图片网上找的,可自行百度mybatis collection select,主要是通过 collection 标签中的 select 指定子查询,然后把column中的字段传到子查询中充当查询条件,简单来说就是不用联表方式,而是各自查各自的再把结果装一起,虽然得到想要的结果了,但后果是每查到一条主查询记录就会产生一条子查询 sql 语句去查询对应多方数据,可想而知十分影响性能,不推荐。
在这里插入图片描述

方法二(嵌套查询)

另一种方法就是可以直接在 sql 中使用嵌套查询方式,像是

select A.xxx, B.xxx from 
( select A.xxx, A.xxx, A.xxx from a_table A limit 0,10 ) as A 	 -- 先分好页得到结果再联表
left join b_table B on A.xx = B.xx 
left join ......

简单来说就是先把主表的10条数据查出来构成一个临时表再去跟想要的表联表查询就可以了

有其他方法或有不对的地方欢迎指正,一起学习进步鸭!!!

猜你喜欢

转载自blog.csdn.net/weixin_45879810/article/details/110952655