多种方法解决Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1
文章目录
- 1. 复现问题
- 2. 分析问题
- 3. 解决问题
- 4. 出现该错误的其他可能
1. 复现问题
今天在调试接口时,突然报出如下错误:
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1
### The error may exist in com/test/cloud/lowcode/mapper/AppCustomComponentVersionMapper.java (best guess)
### The error may involve com.test.cloud.lowcode.mapper.AppCustomComponentVersionMapper.getMaxVersion-Inline
### The error occurred while setting parameters
### SQL: SELECT IFNULL(MAX(version),1.0) from app_custom_component_version WHERE app_custom_component_id = ?;
### Cause: java.sql.SQLException: No value specified for parameter 1
; bad SQL grammar []; nested exception is java.sql.SQLException: No value specified for parameter 1at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)at com.sun.proxy.$Proxy157.selectOne(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:89)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)at com.sun.proxy.$Proxy182.getMaxVersion(Unknown Source)at com.test.cloud.lowcode.service.AppCustomComponentService.getMaxVersion(AppCustomComponentService.java:35)at com.test.cloud.lowcode.service.AppCustomComponentService$$FastClassBySpringCGLIB$$a271163e.invoke(<generated>).....
即Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1
的错误。
2. 分析问题
正赶上最近ChatGPT
很火,于是借助ChatGPT
来解决我的问题,如下所示:
This error generally occurs when a parameter is not supplied in the query or when an incorrect number of parameters are provided. To fix this error, check that the correct number of parameters are supplied and that all parameters have a value specified. Additionally, ensure that the values passed as parameters match the data type of the associated column.
可惜的是,ChatGPT
给出英文的结果,不妨将其翻译成中文,如下所示:
当查询中未提供参数或提供的参数数量不正确时,通常会发生此错误。若要修复此错误,请检查是否提供了正确数量的参数,以及是否指定了所有参数的值。此外,请确保作为参数传递的值与关联列的数据类型匹配。
根据翻译结果可知未提供参数或提供的参数数量不正确
。
再回头看我的错误栈信息,如下图所示:
定位是AppCustomComponentVersionMapper
类的getMaxVersion
方法出现了错误,如下代码所示:
@Mapper
public interface AppCustomComponentVersionMapper extends BaseMapper<AppCustomComponentVersion> {/*** 获取当前组件下最大的版本号** @author super先生* @datetime 2023/2/17:16:53* @param componentId 组件ID* @return*/@Select("SELECT "+ " IFNULL( MAX( version ), 1.0 ) "+ "FROM "+ " app_custom_component_version "+ "WHERE "+ " app_custom_component_id = ? "+ " AND deleted = 0")float getMaxVersion(@Param("componentId") Long componentId);
}
仔细排查@Select
注解中的SQL
语句,突然发现app_custom_component_id = ?
这里语法错误。
我使用的是mybatis
框架,即便参数componentId
有实际值,mybatis
将也无法将值传进去。
因为mybatis
表示占位符的语法是#{变量}
,而非问号(?
),因而,mybatis
生成的SQL语句如下:
SELECTIFNULL(MAX(version), 1.0)
FROMapp_custom_component_version
WHEREapp_custom_component_id = ?
AND deleted = 0
这样的SQL
语句,jdbc
无法执行(mybatis
的底层是jdbc
),才会报出 No value specified for parameter 1
错误。
3. 解决问题
既然知道我的变量语法错误,按照mybatis
的语法修改即可,
也就是将app_custom_component_id = ?
修改为app_custom_component_id = #{componentId}
,如下代码所示:
@Mapper
public interface AppCustomComponentVersionMapper extends BaseMapper<AppCustomComponentVersion> {/*** 获取当前组件下最大的版本号** @author super先生* @datetime 2023/2/17:16:53* @param componentId 组件ID* @return*/@Select("SELECT "+ " IFNULL( MAX( version ), 1.0 ) "+ "FROM "+ " app_custom_component_version "+ "WHERE "+ " app_custom_component_id = #{componentId} "+ " AND deleted = 0")float getMaxVersion(@Param("componentId") Long componentId);
}
此时,重新启动spring boot
服务,调用getMaxVersion
方法,SQL
即可成功运行。
4. 出现该错误的其他可能
正如上文所述,出现这种错误,一般情况下是变量语法的错误,导致框架无法获取到实参。
因而,我们在开发时,一定要注意变量语法。
如果你使用的是jdbc
的executeQuery()
方法,一定不要忘了传参,如下图所示:
你会看到:statement.setString(1,username)
已被注释,自然无参数可传。
因而,我们需要取消注释,如下图所示:
jdbc
才能正常执行sql
语句。
多种方法解决Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1相关推荐
- 解决 Error querying database. Cause: java.sql.SQLException: sql injection violation....
解决 Error querying database. Cause: java.sql.SQLException: sql injection violation- 最近在开发的时候老板的需求就是将模 ...
- 报错:Error querying database. Cause: java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘
报错:Error querying database. Cause: java.sql.SQLException: Access denied for user 'root'@'localhost' ...
- Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource.
记录java Mybatis框架学习过程中遇到的问题 1.搭建第一个mybatis项目的时候发生异常: Exception in thread "main" org.apache. ...
- Error querying database. Cause: java.sql.SQLException:
记录Mybatis学习过程中遇到的问题 2.由于需要将MySQL数据库配置信息写到一个properties文件中,方便以后修改.在连接的时候发生以下错误: Error querying databas ...
- Error querying database. Cause: java.sql.SQLException
0 环境 系统:win10 IDE: IDEA 数据库:sqlserver 1 正文 报错信息 ### Error querying database. Cause: java.sql.SQLExce ...
- ### Error querying database. Cause: java.sql.SQLException: Access denied for user ‘root‘@‘localhost
作为一个初学者在写关于JavaWeb登录跳转的时候出现了一个问题,如下图: 后来花了半天时间找问题,才发现是自己的粗心大意.我也曾经试过是不是数据库连接出问题了,改过数据库名,连接代码等,但是还是解决 ...
- ### Error updating database. Cause: java.sql.SQLException: Incorrect integer value: ‘**‘ for column
类型 异常报告消息 Request processing failed; nested exception is org.apache.ibatis.exceptions.PersistenceExc ...
- Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...
- 解决及分析:MySQL的 Error updating database. Cause: java.sql.SQLException: You can’t specify target table
一.项目从Oracle迁移到MySQL时,报错:Error updating database. Cause: java.sql.SQLException: You can't specify tar ...
最新文章
- docker安装clickhouse_docker 安装ClickHouse
- 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...
- JDBC修改数据库(Object类的应用)
- CodeForces 516E Drazil and His Happy Friends(数学+最短路)
- yii2.0AR两表联查
- 诗与远方:无题(十七)
- python编译为机器码_通过 GraalVM 将 Java 程序编译成本地机器码!
- sql server 内存_SQL Server内存性能指标–第5部分–了解惰性写入,空闲列表停顿/秒和待批内存授予
- 本机与服务器、镜像机之间文件互传
- Chrome 100发布:启用全新图标,修复28个安全漏洞
- ABTest灰度发布
- unix学习笔记1 read () write()
- STM32F407使用MFRC522射频卡调试及程序移植成功
- win10北通手柄没反应_赛博朋克2077正式发售,光靠键鼠可不行,试试北通阿修罗3...
- Atitit fsm有限状态机概念与最佳实践 目录 1. 概念组成与原理成分	1 1.1. 1、状态机的要素 4个要素,即现态、条件、动作、次态	2 1.2. 状态表	2 2. 性状	2 2.1.
- 计算机主板芯片组型号有哪些,如何鉴别主板芯片组型号
- Nginx(1)基础部分
- 计世资讯:大数据将使用户采购存储解决方案呈现两大新特征
- swagger ui 怎么输入对象_java swagger ui 添加header请求头参数的方法
- lucene最新版本下载地址(找死我了)