【解决】Mybatis-plus分页插件一对多分页查询问题

项目场景:

一对多分页查询,查询主表的同时将子表数据查出


问题描述

Mybatis-plus分页插件多表连查寻时数量不对
总条数有8条
实际只查询出了7条
结果丢失了一条数据,并且还会导致主数据里的子数据丢失
– (假如A的某1条数据有B的3条子数据,则可能只会查出1条或者2条)

【解决】Mybatis-plus分页插件一对多分页查询问题_第1张图片

原因分析:

一对一的情况下不会出现一下数据丢失问题

比如图中,我们通过 resultMap 中的 collection 标签指定一对多子类数据的映射

【解决】Mybatis-plus分页插件一对多分页查询问题_第2张图片

在sql中查询结果如下:
A:为作业表 B:为中间表(不做演示) C:为学生表
我们可以看到,查询出了重复数据(3条历史作业,2条生物作业)
这是因为历史作业(A表)下有3位学生(B表),抛开重复数据,只查询出了7条数据
​假如体育作业在第11条,则会因为设置的分页数量为10,导致体育作业被抛弃了~
Mybatis-plus通过直接映射,数据数量不对,8条数据只查询出来7条数据。

【解决】Mybatis-plus分页插件一对多分页查询问题_第3张图片

总结:
其实A表一共才8条数据,是可以全部查询出来的,因为被重复数据占用了,导致数据丢失。


解决方案:

将子表的数据单独查询

【解决】Mybatis-plus分页插件一对多分页查询问题_第4张图片

①:因为中间表(B表)字段没有在映射的实体中,则需要在映射的实体中添加对应字段,如下图
②:映射实体中子表数据集合的名称
③:关联的字段,就是子表查询时需要的字段
④:子表查询语句 select 标签的id名称
⑤:主表查询传入的参数,也就是 ③ 的值

【解决】Mybatis-plus分页插件一对多分页查询问题_第5张图片
注意:

​ 1、主表中将中间表需要关联子表的字段查询出来并取别名对应映射实体添加的字段 如图 ①处
​ 2、删除 collection 下子表的映射字段,通过分开的sql来映射
​ 3、这种写法你的请求条件参数无法传递到子表查询的sql语句中,子表sql的条件参数只能是主表column属性的字段

你可能感兴趣的:(mybatis,java,mysql)