MyBatis封装对象内的List出现的问题
本篇文章问题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出现的问题的更多相关文章
- day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)
1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...
- text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。
text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...
- java中基本类型封装对象所占内存的大小(转)
这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...
- Mybatis增加对象属性不增加mapper.xml的情况
Mybatis增加对象属性不增加mapper.xml的情况: 只增加Model 对象的属性,在查询语句中返回相同名称的字段,但是在mapper中的 resultMap上面不进行新增字段的增加,查询结果 ...
- 双层嵌套json字符串(即json对象内嵌json数组)解析为Map
之前我层写过一篇文章,介绍了json与map的相互转化,但当时只涉及到单一的json对象或json数组,对json对象内嵌套这json数组的json字符串无法处理,这篇文章主要解决这个问题. 之前的那 ...
- dbutils封装对象,单列,一行一列(用)
基本用法:查找并封装对象与对象集合 public User findUserByNamePassword(String name,String password){ QueryRunner runne ...
- vue watch关于对象内的属性监听
vue可以通过watch监听data内数据的变化.通常写法是: data: { a: 100 }, watch: { a(newval, oldVal) { // 做点什么... console.lo ...
- javascript jquery封装对象时的错误,求解!我想知道为什么
jquery 封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...
- mybatis新增对象自动生成uuid方案
mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写 ...
随机推荐
- vue 实现 leaflet的测绘,测距,测面
参考1:https://blog.csdn.net/lonly_maple/article/details/83658608 参考2:https://blog.csdn.net/xtfge0915/a ...
- vs2019 快捷键汇总
https://docs.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-for-frequently-used-com ...
- 使用servlet中是否需要考虑线程问题
package day09; import java.io.IOException; import javax.servlet.ServletException; import javax.servl ...
- Visual Studio 2022 预览版3 最新功能解说
我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...
- IDEA第三方jar包引入的三种方法(专治IDEA2020.1.1的坑)
一: 二: 三:
- maven下载出错
求解
- Django图片上传和前端展示
1 - 模型 class Book(models.Model): #定义图书模型 book_name = models.CharField(max_length=100,verbose_name='书 ...
- 《NAT穿越(NAT-T)RFC3947文档》记录
- SVN无法查看最近日志和提交记录
现象: 使用SVN查看最近的提交记录日志时,最近总是无法显示出全部的日志内容,只能显示到几天之前的日志.就算是自己刚提交的代码也是无法没有记录的. 解决方式:右键选择TortoiseSVN中的&quo ...
- linux系列之:告诉他,他根本不懂kill
目录 简介 使用kill来杀死进程 kill的深入用法 僵尸进程和kill java thread dump 总结 简介 和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,但是却对写出来 ...