【 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咱们顶峰相见!

相关推荐
ClouGence5 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧6 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间6 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心6 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
敲个大西瓜6 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
Curvatureflight6 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-0700016 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben6 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu6 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构