Mybatis多表关联查询字段值覆盖问题
错误展示
- 多表关联查询的返回结果集
<resultMap id="specialdayAndWorktimeMap type="com.hierway.resm.domain.manage.timeSchedule.SpecialDayWorkTimeVO">
<id column="special_date_id" property="specialDateId"/>
<result column="name" property="name"/>
<result column="date" property="date"/>
<result column="type" property="type"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<collection property="workTimeList" ofType="com.hierway.resm.domain.manage.timeSchedule.WorkTime">
<id column="work_time_id" property="workTimeId"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
</collection>
</resultMap>
上面的映射中,返回结果类:SpecialDayWorkTimeVO中定义了7个属性,其中第7个属性是关联查询一对多的对象List。
可以看到在workTime中的属性startTime与endTime和上面的startTime与endTime属性名相同。
- 查询语句展示
<select id="getSpecialDayAndWorkTimesByPuId" resultMap="specialdayAndWorktimeMap">
SELECT sd.special_date_id,sd.name,sd.type,sd.date,sd.start_time,sd.end_time,wt.work_time_id,wt.start_time,wt.end_time
FROM powerunit_specialday_relation AS psr
LEFT JOIN special_day AS sd ON psr.special_date_id = sd.special_date_id
LEFT JOIN specailday_worktime_relation AS swr ON sd.special_date_id = swr.special_date_id
LEFT JOIN work_time AS wt ON swr.work_time_id = wt.work_time_id
WHERE psr.pu_id = #{puId}
</select>
在junit中进行mapper层测试,原本数据库中只有一条SpecialDay的记录,并没有关联的WorkTime记录,那么理想的结果是返回的VO对象中
specialDay相关的属性有值,而List是一个长度为0的List。可是测试结果转为Json格式如下所示:
[{"specialDateId":2,"name":"b","date":"2019-04-27","type":0,"startTime":"5:00","endTime":"17:00","workTimeList":[{"workTimeId":null,"startTime":"5:00","endTime":"17:00"}]}]
可以看到,list中含有一条数据,且前面的属性,覆盖了后面具有相同属性名的WorkTime中的startTime与endTime值,结果与测试结果不符合。
解决方案
- 给workTime表查询结果设置一个区分的别名,同时修改resultMap中标签下的对应的字段名(column元素),展示如下:
<resultMap id="specialdayAndWorktimeMap" type="com.hierway.resm.domain.manage.timeSchedule.SpecialDayWorkTimeVO">
<id column="special_date_id" property="specialDateId"/>
<result column="name" property="name"/>
<result column="date" property="date"/>
<result column="type" property="type"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<collection property="workTimeList" ofType="com.hierway.resm.domain.manage.timeSchedule.WorkTime">
<id column="work_time_id" property="workTimeId"/>
<result column="wstart_time" property="startTime"/>
<result column="wend_time" property="endTime"/>
</collection>
</resultMap>
<!--List<SpecialDayWorkTimeVO> getSpecialDayAndWorkTimesByPuId(Integer puId);-->
<select id="getSpecialDayAndWorkTimesByPuId" resultMap="specialdayAndWorktimeMap">
SELECT sd.special_date_id,sd.name,sd.type,sd.date,sd.start_time,sd.end_time,wt.work_time_id,wt.start_time AS wstart_time ,wt.end_time AS wend_time
FROM powerunit_specialday_relation AS psr
LEFT JOIN special_day AS sd ON psr.special_date_id = sd.special_date_id
LEFT JOIN specailday_worktime_relation AS swr ON sd.special_date_id = swr.special_date_id
LEFT JOIN work_time AS wt ON swr.work_time_id = wt.work_time_id
WHERE psr.pu_id = #{puId}
</select>
- 相同测试数据如下:
[{"specialDateId":2,"name":"b","date":"2019-04-27","type":0,"startTime":"5:00","endTime":"17:00","workTimeList":[]}]
此次测试结果正确!workTimeList长度为0。
Mybatis多表关联查询字段值覆盖问题的更多相关文章
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
- 5.mybatis一对一表关联查询
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据) SELECT * FROM class c,teacher t WHERE c.tid = t.t ...
- spring boot 2使用Mybatis多表关联查询
模拟业务关系:一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysq ...
- 三、Mybatis多表关联查询应用
一对一查询 实现语句:select * from neworder o, user u where o.uid = u.id 实体Order: 接口: 配置: 测试: 一对多查询 实现语句:selec ...
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
- MyBatis 多表联合查询,字段重复的解决方法
MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...
随机推荐
- 用vue开发一个公众号商城SPA——1.前期准备和写页面
使用vue开发公众号商城 第1篇记录项目准备.搭建,写页面遇到第问题以及总结,持续更新 公司最近接了个商城项目,包括PC端商城.微信公众号网页商城.后台管理系统.这几天在做微信公众号商城,又新接触了很 ...
- Spring Boot从入门到精通(七)集成Redis实现Session共享
单点登录(SSO)是指在多个应用系统中,登录用户只需要登录验证一次就可以访问所有相互信任的应用系统,Redis Session共享是实现单点登录的一种方式.本文是通过Spring Boot框架集成Re ...
- 全面认识HBase架构(建议收藏)
在网上看过很多HBaes架构相关的文章,内容深浅不一,直到发现了一篇MapR官网的文章https://mapr.com/blog/in-depth-look-hbase-architecture/#. ...
- JS数组遍历方法集合
就让我们在逆战中成长吧,加油武汉,加油自己 1.for循环 使用零时变量将长度存起来,当数组较大时优化效果才会比较明显. var ar1=[2,4,6,8] for(var i=0;i<ar1. ...
- Mysql(Mariadb)数据库之Information Schema 库中GLOBAL_VARIABLES表 and SESSION_VARIABLES 表分析
Information Schema GLOBAL_VARIABLES and SESSION_VARIABLES Tables The Information Schema GLOBAL_VARIA ...
- 【06】openlayers 切片图层
创建地图: //OSM图层 let source = new ol.source.OSM() //切片图层tilelayer let layers = new ol.layer.Tile({ sour ...
- C语言程序设计(九) 指针
第九章 指针 C程序中的变量都是存储在计算机内存特定的存储单元中的,内存中的每个单元都有唯一的地址 通过取地址运算符&可以获得变量的地址 //L9-1 #include <stdio.h ...
- C#如何实现大小写转换
2020-03-16 每日一例第8天 1.新建窗体应用程序,拖入label/textbox/radiobutton控件,并改text值: 2.button控件输入代码: if (radioButt ...
- nginx升级不改变配置文件
查看当前版本是:1.10.3 [root@proxy nginx-1.10.3]# /usr/local/nginx/sbin/nginx -Vnginx version: nginx/1.10.3b ...
- Markdown试用
目录 今天又是充满希望的一天 一.是什么 二.为什么 三.怎么做 代码 这世界上好人坏人都很多,我不是一个坏人. 我不是个英雄,我只是个拿