当前位置: 首页 > news >正文

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

目录

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

权限管理

一. 🦁 写在前面

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

二. 🦁 探索过程

2.1 开端 —— 开始写 bug

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

SELECTa.id,a.username,r.id ,r.role_name,r.role_desc,p.id ,p.permission_name,p.url 
FROM`admin` aLEFT JOIN admin_role ON a.id = admin_role.aidLEFT JOIN `role` r ON admin_role.rid = r.idLEFT JOIN role_permission ON r.id = role_permission.ridLEFT JOIN permission p ON role_permission.pid = p.id 
WHEREa.id = 133622996

测试结果如下:

在这里插入图片描述
一点毛病没有!

2.2 发展 —— bug 完成

当我自信满满回到项目中,配置完相关代码后(因为时多表查询,所以需要配置一个 xxxMapper.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.urlFROM `admin` aLEFT JOIN admin_roleON a.id = admin_role.aidLEFT JOIN `role` rON admin_role.rid = r.idLEFT JOIN role_permissionON r.id = role_permission.ridLEFT JOIN permission pON role_permission.pid = p.idWHERE a.id = #{aid}
</select>

adminMapper 配置如下:

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

http://www.lryc.cn/news/327164.html

相关文章:

  • PL/SQL的词法单元
  • 第三十二天-PythonWeb主流框架-Django框架
  • 利用python搭建临时文件传输服务
  • 详解 WebWorker 的概念、使用场景、示例
  • IOS面试题编程机制 6-10
  • seleniumui自动化实例-邮箱登录
  • 力扣练习 3.27
  • C 指向指针的指针
  • 通俗易懂:新生代、老年代和永久代/元空间的具体含义是什么?
  • Centos7.9备份mysql数据库
  • Automatic Prompt Engineering
  • Spring高级面试题-2024
  • 用BSP优化3D渲染
  • Composer常见错误解决
  • amazon中sns的使用
  • web前端面试题----->VUE
  • 计算机领域热门技术词汇
  • jsp指令和动作
  • 手撕算法-最小覆盖子串
  • TrOCR—基于Transformer的OCR入门
  • WIN使用LPD协议来共享打印机含统信UOS
  • huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)
  • c++ 有名对象和匿名对象
  • day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
  • 【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
  • 三位数组合-第12届蓝桥杯选拔赛Python真题精选
  • Mongodb入门到入土,安装到实战,外包半年学习的成果
  • 【C++初阶】之类和对象(下)
  • Spring Boot 3 极速搭建OAuth2认证框架
  • 大数据开发(离线实时音乐数仓)