本篇文章问题1:wife的复数形式是wives,不是wifes,英语不好请见谅。

对象举例:

class User {
private String username;
private List<Wife> wifes;
}
class Wife { }

1. 问题

封装出的List长度数据不正确

比如wifes数据应该有两条,但是查询出来只有一条

2. 原因

由于使用Mybatis-plus的分页

    <resultMap id="BaseResultMap" type="com.xj.groupbuy.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="UserWithWifes" type="com.xj.groupbuy.entity.User" extends="BaseResultMap">
<collection property="wifes" ofType="com.xj.groupbuy.entity.Wife">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</collection>
</resultMap>

sql:

    <select id="getAllUser" resultMap="UserWithWifes">
select
u.user_id,
u.username,
r.`wife_id` as wifeId,
r.`name` as wifeName
from `user` u
left join `wife` w on w.`husband_id`=u.`user_id`
</select>

如果采用collection封装的话

此时还是会查询出所有的数据

例如:

userId username wifeId wifeName
1 username 1 wifeName1
1 username 2 wifeName2
1 username 3 wifeName3

此时!如果分页,分一页两条数据的话就会将这三行数据分割开

导致封装出的List长度数据不正确

那么有观众可能会问了,那么会不会出现封装出两个一样的User呢

一个是user:{[wifeName1],[wifeName1 ]},一个是user{[wifeName3]}

答案是不会的,因为mybatis-plus最分页的时候会查询一次count来作为分页的依据

在执行这个sql的时候会计算一次count(*) from user,得到的结果是1,只有1个userId=1的数据

所以以上就会得出一个user:{[wifeName1],[wifeName1 ]},第三个wife就找不到了

3. 解决方法:子查询

1. 需要添加一个Wife对象的resultMap

直接使用Type会封装不上,有知道原因的可以评论区告诉小编哦

    <resultMap id="BaseResultMap" type="com.xj.groupbuy.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="WifeMap" type="com.xj.groupbuy.entity.Wife">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</resultMap>
<resultMap id="UserWithWifes" type="com.xj.groupbuy.entity.User" extends="BaseResultMap">
<collection property="wifes" column="user_id" ofType="com.xj.groupbuy.entity.Wife" select="selectUserWifes">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</collection>
</resultMap>

2. sql

<!--  这里是子查询  -->
<select id="selectUserWifes" resultMap="WifeMap">
select
w.`wife_id`,
w.`name`
from `wife` w
where w.`husband_id`=#{user_id}
</select> <select id="getAllUser" resultMap="UserWithWifes">
select
u.user_id,
u.username
from `user` u
</select>

此时分页的时候,分页操作只会作用在User上,而对Wife没有影响

3. sql解析

首先在mapper调用getAllUser后,会分页查询用户表,

当查询到第一个用户username时将其封装到UserWithWifes,

封装到wifes字段时,去执行子查询找到selectUserWifes方法,

然后根据column对应的user_id去做where查询,并把查询的结果封装成一个List,

最后将封装完成的List 封装到 UserWithWifes的wifes中,之后再查询到第二个用户username2,继续。。。

4. 测试

123

如果喜欢这篇文章的话,给小编点个大大的点赞好嘛

MyBatis封装对象内的List出现的问题的更多相关文章

  1. day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)

    1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...

  2. text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。

    text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...

  3. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  4. Mybatis增加对象属性不增加mapper.xml的情况

    Mybatis增加对象属性不增加mapper.xml的情况: 只增加Model 对象的属性,在查询语句中返回相同名称的字段,但是在mapper中的 resultMap上面不进行新增字段的增加,查询结果 ...

  5. 双层嵌套json字符串(即json对象内嵌json数组)解析为Map

    之前我层写过一篇文章,介绍了json与map的相互转化,但当时只涉及到单一的json对象或json数组,对json对象内嵌套这json数组的json字符串无法处理,这篇文章主要解决这个问题. 之前的那 ...

  6. dbutils封装对象,单列,一行一列(用)

    基本用法:查找并封装对象与对象集合 public User findUserByNamePassword(String name,String password){ QueryRunner runne ...

  7. vue watch关于对象内的属性监听

    vue可以通过watch监听data内数据的变化.通常写法是: data: { a: 100 }, watch: { a(newval, oldVal) { // 做点什么... console.lo ...

  8. javascript jquery封装对象时的错误,求解!我想知道为什么

    jquery   封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...

  9. mybatis新增对象自动生成uuid方案

    mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写 ...

随机推荐

  1. vue 实现 leaflet的测绘,测距,测面

    参考1:https://blog.csdn.net/lonly_maple/article/details/83658608 参考2:https://blog.csdn.net/xtfge0915/a ...

  2. vs2019 快捷键汇总

    https://docs.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-for-frequently-used-com ...

  3. 使用servlet中是否需要考虑线程问题

    package day09; import java.io.IOException; import javax.servlet.ServletException; import javax.servl ...

  4. Visual Studio 2022 预览版3 最新功能解说

    我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...

  5. IDEA第三方jar包引入的三种方法(专治IDEA2020.1.1的坑)

    一: 二: 三:

  6. maven下载出错

    求解

  7. Django图片上传和前端展示

    1 - 模型 class Book(models.Model): #定义图书模型 book_name = models.CharField(max_length=100,verbose_name='书 ...

  8. 《NAT穿越(NAT-T)RFC3947文档》记录

  9. SVN无法查看最近日志和提交记录

    现象: 使用SVN查看最近的提交记录日志时,最近总是无法显示出全部的日志内容,只能显示到几天之前的日志.就算是自己刚提交的代码也是无法没有记录的. 解决方式:右键选择TortoiseSVN中的&quo ...

  10. linux系列之:告诉他,他根本不懂kill

    目录 简介 使用kill来杀死进程 kill的深入用法 僵尸进程和kill java thread dump 总结 简介 和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,但是却对写出来 ...