MyBatis - 自定义 ResultMap 返回数据与数据库查询不一致

问题描述

最近遇到一个查询列表问题,发现实际数据库查询 4 条数据,但是经过程序就是 3 条,一开始怀疑是不是自己程序做了去重啥的,一顿排查猛如虎发现并没有,后来看了下 resultMap 的机制的坑~

<resultMap id="userVO" type="com.xx.UserVO"><result column="userInfo1" jdbcType="VARCHAR" property="userInfo1" /><result column="userInfo2" jdbcType="VARCHAR" property="userInfo2" /><result column="userInfo3" jdbcType="VARCHAR" property="userInfo3" /><result column="cardNo" jdbcType="VARCHAR" property="cardNo" /><association property="userDetailVO" javaType="com.xx.UserDetailVO" resultMap="BaseResultMap"/>
</resultMap>
  • 查询出来的 total 是 4,但是程序查询出来的实际数据是 3

原因分析

SQL 查询出来的数据
userInfo1 userInfo2 userInfo3 userDetailVO
1 2 3 {4,5}
1 2 4 {5,6}
1 2 3 {6,7}Mybatis 处理完之后的数据
userInfo1 userInfo2 userInfo3 userDetailVO
1 2 4 {5,6}
1 2 3 {6,7}

可以知道,我这里是查询一个用户信息 + 用户详情组合。但是 resultInfo1-3 可能会有重复,但是详情是各有不同的,于是 mybatis 就认定相同 resultInfo1-3 相同的是一条数据

于是原本应该是 total = 3 的,实际上查出来的数据只有两条,被 mybatis 做了去重处理

解决方案

  • 在 UserVO 里面加上一个唯一确定的主键,那么这个时候就不存在重复
  • 在 UserVO 里面加上一个能与现在字段构成联合主键的字段,这个时候也不会存在重复,被过滤的情况

原来 Mybatis 的 resultMap 有一个去重机制,它可以帮助我们在查询结果中去除重复的数据。这个机制的核心是使用了一个叫做"discriminator"的标签来设置区分不同结果的标识

案例 DEMO

在 resultMap 中添加 discriminator 标签,设置该标签的 column 属性和 javaType 属性,用于确定区分不同结果的标识是哪个字段,并且该字段的数据类型是什么

<resultMap id="userResultMap" type="User"><id property="id" column="id" /><result property="username" column="username" /><result property="email" column="email" /><discriminator column="type" javaType="string"><case value="1" resultMap="studentResultMap" /><case value="2" resultMap="teacherResultMap" /></discriminator>
</resultMap>

在各个子 resultMap 中设置唯一区分标识的值,并且保证不同的 resultMap 区分的标识值不同

<resultMap id="studentResultMap" type="Student"><id property="id" column="id" /><result property="studentName" column="student_name" /><result property="studentAge" column="student_age" />...
</resultMap><resultMap id="teacherResultMap" type="Teacher"><id property="id" column="id" /><result property="teacherName" column="teacher_name" /><result property="teacherAge" column="teacher_age" />...
</resultMap>

这样,当查询结果中有相同区分标识的数据时,Mybatis 就会将它们视为同一条数据,只返回其中的一条。通过这个机制,我们可以有效地去除重复数据,使查询结果更加准确和具有可读性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167146.shtml

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

相关文章

electerm 跨平台的终端 /ssh/sftp 客户端

文章目录 electerm功能特性主题配色 electerm 每个程序员基本都离开SSH链接工具,目前市场上好用的基本都是收费的 给大家推荐一款国人开发的开源链接工具https://github.com/electerm/electerm 到目前为止star已经9.5K了,非常受欢迎 功能特性 支持ssh,telnet,serialport,本地和…

使用AndResGuard报错:copy res file not in resources.arsc file:Ezi.xml

Android使用AndResGuard进行资源混淆&#xff0c;压缩。 源码地址&#xff1a;GitHub - shwenzhang/AndResGuard: proguard resource for Android by wechat team 集成完成后编译过程中出现如下错误&#xff1a; 14:57:05 copy res file not in resources.arsc file:IUk.xml…

CMake API使用指南

文章目录 CMake 的基本语法和用法1. CMakeLists.txt 基本结构2. 变量和宏3. 条件语句4. 循环语句5. 定义和使用函数6. 导入库和链接库7. 设置编译器选项 message1. 显示普通消息&#xff1a;2. 显示带模式的消息&#xff1a;3. 显示变量值&#xff1a;4. 显示多行消息&#xff…

ptpd2提示failed to join the multicast group (strerror: No buffer space available)

下载交叉编译ptpd-ptpd-2.3.1源码&#xff0c;在IMX6板子上面运行ptpd2提示错误如下&#xff1a; rootimx6qsabresd_genvict:~# ./ptpd2 -C -m -i eth0 2023-11-24 14:30:21.484399 ptpd2[6512].startup (info) (___) Configuration OK 2023-11-24 14:30:21.487152 ptpd2…

3ds Max 电脑配置建议 | 建模+渲染选专业显卡or游戏显卡?

&#xfeff;使用3ds Max进行建模和渲染时&#xff0c;选择合适的电脑配置非常重要。比如在硬件选择上&#xff0c;究竟选购游戏显卡还是专业显卡呢&#xff1f;本文将为你详细介绍游戏显卡和专业显卡的区别&#xff0c;并提供配置建议&#xff0c;助你作出明智的决策。 &#…

gcc编译优化

优化选项 -flto Whole Program Mode&#xff08;整个程序模式&#xff09;&#xff1a;在这种模式下&#xff0c;编译器对整个程序进行优化。它通过将所有源文件合并成一个单独的中间表示&#xff08;IR&#xff09;文件&#xff0c;然后进行全局的优化和代码生成。这种模式可…

手把手用GPT开发小程序全流程!就是这么easy~

大家好&#xff0c;我是五竹。 前段时间用GPT开发了一款小程序:GPT真牛批&#xff01;三天开发一个小程序&#xff0c;三天积累了2000的用户&#xff0c;上周末抽空又接入了流量主&#xff0c;感兴趣的同学可以围观一下。 今天就来带大家走一遍用GPT开发一款小程序的全过程&a…

为什么选择美国VPS服务器

企业、个人和组织都需要一个稳定高效的服务器来托管他们的网站、应用程序和数据。而对于中国用户来说&#xff0c;寻找一个性价比高的便宜美国VPS服务器&#xff0c;既能满足需求&#xff0c;又能节约成本&#xff0c;成为了一个非常重要的问题。 VPS即虚拟专用服务器&#xf…

Sulfo-Cy3-COOH荧光染料的合成和反应机制

Sulfo-Cy3-COOH**(源自星戈瑞的花菁染料)**荧光染料的合成通常涉及多个步骤&#xff0c;其中包括官能团的引入、染料核心的合成以及亲水性修饰等。 官能团引入&#xff1a; 合成Sulfo-Cy3-COOH的第一步通常是引入羧酸&#xff08;COOH&#xff09;官能团。这可以通过对已有的C…

C++算法 —— 贪心(3)

文章目录 1、买卖股票的最佳时机2、买卖股票的最佳时机Ⅱ3、K次取反后最大化的数组和4、按身高排序5、优势洗牌6、最长回文串7、增减字符串匹配 1、买卖股票的最佳时机 121. 买卖股票的最佳时机 这里最容易想到的就是暴力枚举&#xff0c;两层for循环&#xff0c;i 0&#xf…

RTMP直播应用与延时分析

直播应用中&#xff0c;RTMP和HLS基本上可以覆盖所有客户端观看&#xff0c; HLS主要是延时比较大&#xff0c;RTMP主要优势在于延时低。 一、应用场景 低延时应用场景包括&#xff1a; . 互动式直播&#xff1a;譬如2013年大行其道的美女主播&#xff0c;游戏直播等等各种…

TFA-Net

TFA SCA means ‘Self-Context Aggregation’ 作者未提供代码

一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

数据字典回显功能设计与实现

数据字典回显功能设计与实现 文章目录 数据字典回显功能设计与实现1. 业务场景2. 实现设计2.1 注解AOP切面2.2 注解mybatis拦截器2.3 注解序列化2.4 涉及字段直接申明成字典引用类型mybatis拦截器反序列化处理 3. 具体实现 1. 业务场景 我们日常开发中经常会遇到&#xff1a;数…

羊大师教你,什么搭配羊奶能够带来全方位的营养?

羊奶作为一种营养价值极高的乳制品&#xff0c;其丰富的营养成分对人体健康有着诸多益处。然而&#xff0c;不同的食物搭配会对羊奶的营养吸收产生不同的影响。为了让大家更好地利用羊奶的营养价值&#xff0c;下面小编羊大师将为大家介绍一些与羊奶搭配的食物&#xff0c;帮助…

Qt实现画的图片移动

要实现左键点击鼠标时图片跟着鼠标移动&#xff0c;可以通过以下步骤来实现&#xff1a;1. 在QGraphicsView的构造函数中设置鼠标跟踪属性&#xff0c;以便能够捕获鼠标事件。cpp QGraphicsView::QGraphicsView(QWidget *parent) : QGraphicsView(parent) {setMouseTracking(tr…

Leetcode617合并二叉树

理解题意&#xff1a;相同节点位置上&#xff0c;都有数据的话&#xff0c;节点值相加&#xff0c;只有一方有数据的话&#xff0c;把有数据的部分及相关子树保留下来。 考察操作两棵二叉树&#xff0c;二叉树的遍历。 一般有两种解决方式&#xff1a; 递归|迭代。 区别&#x…

element 中文地址

Element - The worlds most popular Vue UI framework 2 Menu 菜单 | Element Plus 3 侦听器 | Vue.js vue中文官网

软件测试职业规划导图

公司开发的产品专业性较强&#xff0c;软件测试人员需要有很强的专业知识&#xff0c;现在软件测试人员发展出现了一种测试管理者不愿意看到的景象&#xff1a; 1、开发技术较强的软件测试人员转向了软件开发(非测试工具开发)&#xff1b; 2、业务能力较强的测试人员转向了软件…