【 MyBatis 】| 关于多表联查返回 List 集合只查到一条的 BUG

目录

  • [一. 🦁 写在前面](#一. 🦁 写在前面)
  • [二. 🦁 探索过程](#二. 🦁 探索过程)
    • [2.1 开端 ------ 开始写 bug](#2.1 开端 —— 开始写 bug)
    • [2.2 发展 ------ bug 完成](#2.2 发展 —— bug 完成)
    • [2.3 高潮 ------ bug探究](#2.3 高潮 —— bug探究)
    • [2.4 结局 ------ 效果展示](#2.4 结局 —— 效果展示)
  • [三. 🦁 写在最后](#三. 🦁 写在最后)

一. 🦁 写在前面

今天又是 BUG 气满满的一天,一个 xxxMapper.xml 因主键id 重复而出现的 bug 献上!

二. 🦁 探索过程

2.1 开端 ------ 开始写 bug

就在刚刚,🦁 在写项目的时候,在实现一个多表联查的功能时,遇到一个不可描述的 BUG,我写完SQL 测试完成才去项目配置相关映射的!SQL 如下:

sql 复制代码
SELECT
	a.id,
	a.username,
	r.id ,
	r.role_name,
	r.role_desc,
	p.id ,
	p.permission_name,
	p.url 
FROM
	`admin` a
	LEFT JOIN admin_role ON a.id = admin_role.aid
	LEFT JOIN `role` r ON admin_role.rid = r.id
	LEFT JOIN role_permission ON r.id = role_permission.rid
	LEFT JOIN permission p ON role_permission.pid = p.id 
WHERE
	a.id = 133622996

测试结果如下:


一点毛病没有!

2.2 发展 ------ bug 完成

当我自信满满回到项目中,配置完相关代码后(因为时多表查询,所以需要配置一个 xxxMapper.xml 文件):

xml 复制代码
   <select id="findById" parameterType="long" resultMap="adminMapper">
   SELECT a.id,a.username,r.id ,r.role_name,r.role_desc,p.id ,p.permission_name,p.url
   FROM `admin` a
   LEFT JOIN admin_role
   ON a.id = admin_role.aid
   LEFT JOIN `role` r
   ON admin_role.rid = r.id
   LEFT JOIN role_permission
   ON r.id = role_permission.rid
   LEFT JOIN permission p
   ON role_permission.pid = p.id
   WHERE a.id = #{aid}
</select>

adminMapper 配置如下:

xml 复制代码
<resultMap id="adminMapper" type="com.lion.online.pojo.Admin">
    <id property="id" column="id"></id>
    <result property="username" column="username"></result>
    <collection property="roles" column="id" ofType="com.lion.online.pojo.Role">
        <id property="id" column="id"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="permissions" column="id" ofType="com.lion.online.pojo.Permission">
            <id property="id" column="id"/>
            <result property="permissionName" column="permission_name"></result>
            <result property="url" column="url"></result>
        </collection>
    </collection>
</resultMap>

运行控制台结果和数据库查询的结果一样:

正当一切都是朝着正轨走的时候,页面运行的结果却长这样:

🦁 已经亚麻住了... ... 想起了手机中的这个表情包:

2.3 高潮 ------ bug探究

出现这个结果始料不及,于是去搜了一下,发现也有很多 冤大头 出现了和我一样的错误,终于知道问题出现在哪里!

原因是在构造返回类型的时候使用了 ResultMap 标签,但是由于我的数据库表主键名字都是 id,所以在 ResultMap 中出现了多个同样的 id 字段,导致分表的 id 值和主表一样(简单来说就是Mybatis在查询时,对这几个都长得一样的id 混乱了!)。知道了问题,我们就可以着手解决了:

  • 配置 collection 一对多关联的话需要改 column 别名,否则查询出来条数不对!
  • 在 ResultMap 中,property 属性对应实体类中的属性,而 column 属性严格来说对应结果集中的列名,而不是数据库中的列名。
    • 例如,如果对列起了别名,那么 column 属性对应的就是别名,而不是原来的列名。

改动如下:

  • resultMap 修改 column 列名:
  • 代码使用别名

2.4 结局 ------ 效果展示

三. 🦁 写在最后

一个 BUG 赠给屏幕前的你!望君喜欢。


🦁 其它优质专栏推荐 🦁

🌟《Java核心系列(修炼内功,无上心法)》: 主要是JDK源码的核心讲解,几乎每篇文章都过万字,让你详细掌握每一个知识点!
🌟 《springBoot 源码剥析核心系列》:一些场景的Springboot源码剥析以及常用Springboot相关知识点解读

欢迎加入狮子的社区 :『Lion-编程进阶之路』,日常收录优质好文

更多文章可持续关注上方🦁的博客,2023咱们顶峰相见!

相关推荐
代码什么用3 小时前
使用javassist生成类 && MyBatis中接口代理机制及使用
mybatis
晚风叙码6 小时前
MySQL 表的操作:从建表到删表,一篇讲清楚
android·mysql·oracle
paopaokaka_luck6 小时前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
其实防守也摸鱼8 小时前
渗透测试学习计划(全栈综合 · 零基础进阶)
android·数据库·学习·安全·oracle·自动化·学习方法
韩曙亮9 小时前
【JavaEE】MyBatis 基本用法 ⑤ ( 单条件查询 | 多条件查询 | 多条件动态查询 | 单条件动态查询 )
java·sql·java-ee·mybatis·mapper·sql映射
无忧.芙桃10 小时前
网络安全与个人信息保护
oracle
x-Achan10 小时前
Redis实现方案:更新策略、穿透、雪崩、击穿、工具封装
java·spring boot·redis·spring·bootstrap·mybatis
泡海椒20 小时前
数据占比展示:jquick-pdf饼图动态数据渲染PDF教程
数据库·oracle·pdf
jnrjian1 天前
Connect Microsoft Tools to Oracle Databases powerbi 之类的oracle 客户端
数据库·microsoft·oracle
TDengine (老段)1 天前
集群从“能用“到“高可用“:副本、选主与故障切换到底怎么配
大数据·网络·数据库·物联网·oracle·时序数据库·tdengine