时间:2021-07-01 10:21:17 帮助过:4人阅读
此刻产品需求就是search这个条件去掉,那就习惯性的用IDEA快捷键CTRL+/ 来了一个and条件注释
select count(1) from product where code = #{code}
# and search =#{search} and kskdsk=#{kskdsk}
然后IDEA就很乖巧的给我注释..注释了...,显示状态也是灰色的显示,应该没什么问题了.
经过紧急的五分钟排查日志,看到了这个异常
org.springframework.dao.TransientDataAccessResourceException: ### Error querying database. Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2). ### The error may exist in file [/***/***/***Mapper.xml] ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: select count(1) from product where code = ? # and search=? and kskdsk=?
毫无疑问,问题肯定是这个SQL导致的问题,我一看,天哪,注释的语句怎么跑到预编译的SQL中了!不是应该忽略吗?很明显,不是预想的那样.首先错误的意思大概就是,我的SQL中只需要两个参数,我传了三个参数进去,有一个参数找不到他的坑位,其次就是这个#号注释导致的问题,没有被忽略,虽然我们在Navicat for MySql中可以用#号,但是预编译不行,他会把注释给编译到SQl中,除非用<!---->这种注释才可以.
这个注释导致
一.参数个数不一致,导致多传的参数不知道放在哪里
二.注释在预编译语句还是当成SQL一部分执行
分享出来,避免大家踩坑,也同时反映了自己的一部分问题,没有经过测试流程,没有进行系统的自测,下次需要规范流程,避免产生不必要的问题.这虽然是个小问题,但也反映了很多不足.
一个SQL注释引发的线上问题
标签:select rod default 问题 sel tran def error 一个