本篇文章问题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. 【mysql】mysql简介及高手是如何练成的

    1.什么是mysql  MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 公司. Mysql 是开源的,可以定制的,采用了GPL 协议,你可以修改源码 ...

  2. C++ Opencv图像直方图

    Mat image = imread("D:/ju.jpg"); imshow("素材图", image); int bins = 256; //直条为256 ...

  3. 【转载】vim 中文帮助手册的安装

    本文出处http://hi.baidu.com/bkhcvzdvmjfkpyr/item/9c238224c1a69498b6326360 vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅 ...

  4. Java程序设计学习笔记(三)—— IO

    时间:2016-3-24 11:02 --IO流(Input/Output)     IO流用来处理设备之间的数据传输.    Java对数据的操作是通过流的方式.    Java对于操作流的对象都在 ...

  5. LVS本地实验环境搭建

    文中实验需要使用以下软件: CentOS的镜像 Virtual Box GNS3 0.实验前的准备工作 0.1.修改yum源 为了方便安装软件,我们设置yum源为公司yum源 1.直接复制公司机器上的 ...

  6. C#·好文分享

    时间:2018-11-14 记录:byzqy 好文收藏,集中分享! 标题:C#接口<通俗解释> 地址:https://www.cnblogs.com/hamburger/p/4681681 ...

  7. 每天迁移MySQL历史数据到历史库Python脚本

    #!/usr/bin/env python # coding:utf-8 #__author__ = 'Logan'      import MySQLdb import sys import dat ...

  8. MySQL-LSN

    查看lsn:   show engine innodb status Log sequence number 2687274848548    Log flushed up to 2687274848 ...

  9. 高并发HHTP实践

    当今,正处于互联网高速发展的时代,每个人的生活都离不开互联网,互联网已经影响了每个人生活的方方面面.我们使用淘宝.京东进行购物,使用微信进行沟通,使用美图秀秀进行拍照美化等等.而这些每一步的操作下面, ...

  10. Qt5获取系统文件图标,文件路径

    获取系统图标: QFileIconProvider icon_provider; QIcon icon = icon_provider.icon(QFileIconProvider::Folder); ...