【踩坑日常】mysql查询错误排查

背景

在生产上发现一个接口数据怎么查都为空,做的日志记录,sql语句以及参数手动执行却能返回结果

排查

刚发现问题的时候,第一时间是通过日志去查看问题,模拟下核心点就如下

2024-01-24 14:10:03,912 DEBUG selectSQL:137 - ==>  Preparing: SELECT COUNT(*) FROM a cwo   WHERE cwo.`ques` REGEXP replace(' 3.* ',' ','') 
2024-01-24 14:10:03,920 DEBUG selectSQL:137 - <==      Total: 1

mapper对应的查询语句是这么写的

  <select id="selectSQL" resultType="integer">
    SELECT COUNT(*) FROM a cwo
     <where>
       <if test="param.ques!= null and param.ques.size() > 0">
         <foreach collection="param.ques" item="que" separator=","
                  open="cwo.`ques` REGEXP replace('" close="',' ','')">
  	         ${que}
         </foreach>
       </if>
     </where>
  </select>

tips1:这里之所以是用${}而不是#{}去写,是因为这里需要一个完整的字符串去执行正则(后面想了想,其实这个不是只要在逻辑里先拼接好不就行了吗?!(摔)),而占位符只会生成一个个的字符串对象,所以用了连接符去生成一个字符串
tips2:这里用replace(data, ’ ', ‘’)是因为拼接可能会出现多余的空格,导致regexp正则匹配失败

拿上面debug的sql去数据库执行,是有数量返回的,而调用接口,只会返回0

分析

既然打印日志发现不了问题,那就进行断点调试,这里就不说断点调试过程了,网上挺多的文章的,直接断点分析到SimpleExecutor.java

  @Override
  public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    Statement stmt = null;
    try {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
      stmt = prepareStatement(handler, ms.getStatementLog());
      // 执行到这里的时候,stmt是带着sql完整语句的,可以查看自己生成的真正SQL语句(stmt.h.statement.delegate)
      return handler.query(stmt, resultHandler);
    } finally {
      closeStatement(stmt);
    }
  }

然后就看到了

HikariProxyPreparedStatement@1735946981 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: SELECT COUNT(DISTINCT csr.cwo_id) FROM a cwo
		 WHERE  cwo.`ques` REGEXP replace('
		                                  2.*
		                                  ',' ','')

可以看到由于平时的小强迫症写法,导致生成的字符串是带了换行的,replace没能正确生成我们预期的正则表达式,导致匹配不到数据

tips
这里断点有个小技巧,idea点击断点,选择More,
在这里插入图片描述
然后选中你调用sql的位置断点,这样就能在直到执行你想要断点的位置时,才会进入SimpleExecutor
在这里插入图片描述

解决

既然是写法问题,那就修改mapper文件,这样就可以了

  <select id="selectSQL" resultType="integer">
    SELECT COUNT(*) FROM a cwo
     <where>
       <if test="param.ques!= null and param.ques.size() > 0">
         <foreach collection="param.ques" item="que" separator=","
                  open="cwo.`ques` REGEXP replace('" close="',' ','')">${que}</foreach>
       </if>
     </where>
  </select>

总结

平时写sql多多少少会遇到各种奇奇怪怪的现象,但是大多数能够通过打印的日志发现问题,如果坚信sql是对的的话,不妨断点确认下最终送给数据库的语句是怎样的(毕竟,各种插件在便利代码的同时,可能意外给你加上各种意料外的条件 😃

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vp9解码方式概述 -- Parsing Process

Vp9解码方式概述 – Parsing Process 本文是对vp9协议第9章&#xff0c;解析字符串函数的一个梳理&#xff0c;主要对几种解析类型&#xff08;Type&#xff09;的流程进行梳理 目录 Vp9解码方式概述 -- Parsing Process1. 如何解码视频&#xff1f;2. f(n)3. 布尔解码器Boole…

核心类库ArrayList、hashMap等

八. 核心类库 1. ArrayList 数组缺点 ArrayList&#xff0c;它常常被用来替代数组 数组的缺点&#xff1a;不能自动扩容&#xff0c;比如已经创建了大小为 5 的数组&#xff0c;再想放入一个元素&#xff0c;就放不下了&#xff0c;需要创建更大的数组&#xff0c;还得把旧…

基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151

Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee &#x1f41d; 到 MQTT 桥接器 &#x1f309;&#xff0c;可以摆脱专有的 Zigbee 桥接器 &#x1f528; 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…

Salesforce Lightning 的 Close Case 按钮无法批量关闭 Case 的原因和解决方法

为 Lightning 页面添加了自定义的 Close Case 按钮&#xff08;方法可参考&#xff1a;https://www.simplysfdc.com/2021/01/salesforce-mass-close-case.html&#xff09;后&#xff0c;可能会出现无法批量关闭 Case 的情况。 选中多个 Case&#xff0c;再点击 Close Case 按…

MYSQL数据库详解(6)-- 视图存储方式触发器

MYSQL数据库详解&#xff08;6&#xff09; 视图特征&#xff1a;作用&#xff1a;创建视图使用视图删除视图 存储过程 ***为什么使用存储过程定义&#xff1a;存储过程和函数的区别缺陷&#xff1a;创建存储过程使用存储过程环境变量 局部环境变量 全局环境变量删除存储过程…

10个免费高质量视频素材网站,无版权,可商用。

推荐10个高清无水印视频素材网站&#xff0c;免费下载&#xff0c;无版权可商用&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类…

【Web前端实操13】实现100*100的盒子的阴影效果,阴影值自拟

相关知识点&#xff1a; 盒阴影 box-shadow 向框添加一个或多个阴影。 1 box-shadow: h-shadow v-shadow blur spread color inset; 值描述h-shadow必选&#xff0c;水平阴影的位置v-shadow必选&#xff0c;垂直阴影的位置blur可选&#xff0c;模糊距离spread可选&#xf…

AI伦理边界:探索人工智能伦理计算

大家好&#xff0c;近年学界与工业界都已开始关注并热议 AI 伦理治理问题&#xff0c;也在伦理规范研究上取得了初步进展。然而&#xff0c;由于 AI 伦理的抽象性&#xff0c;如何定量化度量智能系统的伦理&#xff0c;还是一个未知的难题。 李学龙教授团队在《中国科学&#…

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …

江大白 | 万字长文图解Numpy教程,看这一篇就够了!

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满&#xff0c;有超级详细的图解。 原文链接&#xff1a;万字长文图解Numpy教程&#xff0c;看这一篇就够了&#xff01; (qq.com) 以下文章来源于博客&#xff1a;Medium 作者&…

.zip 文件和 .tar.gz文件 的区别

tgz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是一样的,只是压缩格式不一样. tar.gz格式的文件比zip文件要小不少。tar.gz压缩格式用于unix的操作系统, 而zip用于windows的操作系统,但在windows系统中WinRar工具同样可以解压缩tar.gz格式的。 扩展&#xff1a; z…

被困住了——如何从层级结构中获取子集

大家好&#xff0c;我是欧阳方超&#xff0c;我被一个问题困住了。 事情是这样的&#xff0c;与第三方平台对接时&#xff0c;第三方接口返回了一个具有层级结构的列表&#xff0c;比如下面这种结构&#xff1a; [{"id": 1,"name": "Root Category 1…

c++之说_9|自定义类型 struct

今天我这里下雪了 很冷 你哪里呢&#xff1f; 我们 来谈谈 自定义类型 这只是一个称呼 包含有 结构体&#xff08;struct&#xff09; 类&#xff08;class&#xff09; 共用体&#xff08;union&#xff09; 枚举&#xff08;enum&#xff09; 我们编程基本要常常与…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求&#xff0c;仅想提高sink2es的qps&#xff0c;所以仅调节了sink2es的并行度&#xff0c;但在调节不同算子并行度时遇到一些问题&#xff0c;找出问题的根本原因解决问题&#xff0c;并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

对比损失函数

多看大佬的文章&#xff0c;总结的太好了&#xff01; 善于利用工具&#xff1a;researchrabbit 所以应该是contrastive metric learning

美,英,法,德、意大利和西班牙的geojson,以及区域json

美&#xff0c;英&#xff0c;法&#xff0c;德、意大利和西班牙的geojson文件 json地址 https://pan.baidu.com/s/1nio1bV_j-jAEVqgEHXWsNw?pwdqwer#list/path/GEOJSON 感谢大佬提供的 大佬连接 大佬的知乎原地址 国内geojson获取工具地址 http://da![在这里插入图片描述](h…

【大数据】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

流处理基础概念&#xff08;一&#xff09;&#xff1a;Dataflow 编程基础、并行流处理流处理基础概念&#xff08;二&#xff09;&#xff1a;时间语义&#xff08;处理时间、事件时间、水位线&#xff09;流处理基础概念&#xff08;三&#xff09;&#xff1a;状态和一致性模…

【并发】什么是 Future?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 关键特性和操作包括&#xff1a; 提交任务&#xff1a; 查询完成状态&#xff1a; 等待结果&#xff1a; 取消任务&#xff1a…

[linux] 域名解析失败案例定位 [Errno -2] Name or service not known

首先发现代码里这段运行报错&#xff1a; socket.gethostbyname_ex(host_name) Traceback (most recent call last): File “”, line 1, in socket.gaierror: [Errno -2] Name or service not known import socket host_name socket.gethostname() print(socket.gethostby…

搜索(3):双向BFS

对于一些问题我们使用普通BFS求解时&#xff0c;队列中最多会存在两层的搜索节点&#xff0c;搜索空间的上界取决于目标节点所在的搜索层次的深度所对应的宽度&#xff0c;一旦层数比较多&#xff0c;那可能会出现搜索爆炸的问题&#xff0c;双向BFS可以让我们不使用这么宽的搜…