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条数据查出来构成一个临时表再去跟想要的表联表查询就可以了,但如果关联的表需要条件查询的话可能就不适用了。

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

您可以使用MyBatis Plus的`Page`对象来进行一对多分页查询。以下是一种可能的实现方式: 1. 首先,创建一个包含分页信息的DTO对象,例如: ```java public class MyPageDTO<T> { private long current; private long size; private List<T> records; // getter/setter 省略 } ``` 2. 在您的Mapper接口中定义两个方法,一个用于查询总数,另一个用于查询分页数据。假设有两个实体类`User`和`Order`,并且`User`与`Order`之间有一对多关系。 ```java public interface UserMapper extends BaseMapper<User> { // 查询总数 long selectUserCount(); // 查询分页数据 List<User> selectUserPage(@Param("page") Page<User> page); } ``` 3. 在您的Service中,实现一对多分页查询的业务逻辑。 ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public MyPageDTO<User> getUserPage(long current, long size) { MyPageDTO<User> myPage = new MyPageDTO<>(); myPage.setCurrent(current); myPage.setSize(size); Page<User> page = new Page<>(current, size); List<User> userList = userMapper.selectUserPage(page); // 设置查询结果到DTO对象中 myPage.setRecords(userList); // 设置总数 long totalCount = userMapper.selectUserCount(); myPage.setTotal(totalCount); return myPage; } } ``` 4. 最后,在您的Controller中调用Service方法,并返回结果。 ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public MyPageDTO<User> getUserPage(@RequestParam("current") long current, @RequestParam("size") long size) { return userService.getUserPage(current, size); } } ``` 这样,您就可以通过`/users`接口进行一对多分页查询了。请根据您的实际情况进行适当的调整。希望对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值