【 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.rhkb.cn/news/293889.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跑spark的yarn模式时RM连不上的情况

在linux控制台跑spark on yarn一个测试案例&#xff0c;日志中总显示RM连yarn服务的时候是&#xff1a;0.0.0.0:8032 具体情况如下图&#xff1a; 我问题出现的原因&#xff0c;总结如下&#xff1a; 1.防火墙没关闭&#xff0c;关闭 2.spark-env.sh这个文件的YARN_CONF_DIR…

MyBatis基础使用

MyBatis首页https://mybatis.net.cn/ MyBatis细节注意&#xff0c;让你更加熟悉MyBatishttps://blog.csdn.net/m0_61160520/article/details/137173558?spm1001.2014.3001.5501 1.项目目录 2.数据库 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_e…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

vue3+threejs新手从零开发卡牌游戏(二十):添加卡牌被破坏进入墓地逻辑

在game目录下新建graveyard文件夹存放墓地相关代码&#xff1a; game/graveyard/p1.vue&#xff0c;这里主要设置了墓地group的位置&#xff1a; <template><div></div> </template><script setup lang"ts"> import { reactive, ref,…

【刷题】 二分查找入门

送给大家一句话: 总有一天&#xff0c;你会站在最亮的地方&#xff0c;活成自己曾经渴望的模样—— 苑子文 & 苑子豪《我们都一样 年轻又彷徨》 二分查找入门 1 前言2 Leetcode 704. 二分查找2.1 题目描述2.2 算法思路 3 Leetcode 34. 在排序数组中查找元素的第一个和最后…

求组合背包II(acwing)

题目描述&#xff1a; 给定n组循问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod (1e9 7)的值&#xff0c;。 输入格式&#xff1a; 第一行包含整数n。 接下来2行&#xff0c;每行包含一组a和b。 输出格式&#xff1a; …

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天&#xff0c;维护那天之前的最小值即可。 在题目中&#xff0…

面试题:MySQL 优化篇

定位慢查询 &#x1f496; 开源工具 调试工具&#xff1a;Arthas&#xff08;阿尔萨斯&#xff09;运维工具&#xff1a;Prometheus&#xff08;普罗米修斯&#xff09;、Skywalking &#x1f496; MySQL 慢查询日志 # 开启 MySQL 慢查询日志开关 slow_query_log1 # 设置慢…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的&#xff0c;然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明&#xff0c;会引起wx.navigateTo无法跳转到组件问题&#xff01; 扫码查看小程序&#xff0c;可以体验效果&#xff1a; 以下是官方…

ElementUI表格table组件实现单选及禁用默认选中效果

在使用ElementUI&#xff0c;需要ElementUI表格table组件实现单选及禁用默认选中效果, 先看下效果图&#xff1a; 代码如下&#xff1a; <template><el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"widt…

C语言之位段

1.位段的声明 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如&#xff1a; struct A {int _a:2;int _b:5;int _c:10;int _d:30; }; A 就是一个位段类型…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

商品服务 - 三级分类

1.递归查询树形结构 Overridepublic List<CategoryEntity> listWithTree() {//1.查出所有分类List<CategoryEntity> all this.list();//2.组装成父子的属性结构List<CategoryEntity> level1Menus all.stream().filter(c -> c.getParentCid().equals(0L)…

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】 题目描述&#xff1a;解题思路一&#xff1a;一边算前缀和一边统计。这里用哈希表统计前缀和出现的次数&#xff0c;那么和为k的子数组的个数就是当前前缀和-k的个数&#xff0c;即preSums[presum - k]。画个图表述就是&a…

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

Java封装最佳实践:打造高内聚、低耦合的优雅代码~

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、封装 1.1 封装的概念 面向对象程序三大…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

【数据结构】优先级队列——堆

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟&#xff0c;年月日&#xff0c;时分秒&#xff0c;用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载&#xff0c;地址链接见下方。 链接&#xff1a;https://pan.b…

开源,微信小程序-超级计算器T3000 简介

笔者于四年前自学微信小程序开发&#xff0c;这个超级计算器T3000就是当时的练习作品。超级计算器T3000的功能有很多&#xff0c;其中的核心技术是矩阵计算&#xff0c;使用的工具库是math.js&#xff0c;其次是复杂运算和分式运算。关于math.js的使用&#xff0c;可以参考另一…