zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【异常】Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1

JAVADatabaseSQL异常 Error for No value
2023-09-14 09:04:55 时间

一、 报错内容

Cause: java.sql.SQLException: No value specified for parameter 1

2023-03-10 14:08:26.452 [project-terminal-api] [XNIO-1 task-1] ERROR .
###  GlobalExceptionHandler - 
### 请求地址'/api/V1/log/uploadCompleted',发生未知异常.org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLException: No value specified for parameter 1
### The error may exist in URL [jar:file:/project/!/BOOT-INF/classes!/mapper/CrashLogMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT crash_id count         FROM t_crash_log_main         WHERE project_id = ?1           AND log_hash = ?2         LIMIT 2
### Cause: java.sql.SQLException: No value specified for parameter 1
; bad SQL grammar []; nested exception is java.sql.SQLException: No value specified for parameter 1
	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)

二、 报错说明

定位错误的SQL语句,找到了如下SQL内容,这一看好像很熟悉啊。占位符赋值

<select id="countByLogHashByLimit" resultType="java.lang.String">
    SELECT crash_id count
    FROM t_crash_log_main
    WHERE project_id = ?1
      AND log_hash = ?2
    LIMIT 2
</select>

出现因为执行Mybatis先于对SQL语句中的占位符赋值出错了,Mybatis获取参数值得两种方式:${}和#{}
因此,导致了以上错误No value specified for parameter 1

好吧,因为ORM层发生了改变,代码是从JPA迁移到Mybatis中的,所有这个?1 , ?2 代码没有改到。

<select id="selectIdByLogHashLimit" resultType="java.lang.String">
    SELECT crash_id
    FROM t_crash_log_main
    WHERE project_id = #{projectId}
      AND log_hash = #{hashValue}
    LIMIT #{i}
</select>

三、 问题解决

将Mybatis中的XML文件修改成如下即可。

<select id="selectIdByLogHashLimit" resultType="java.lang.String">
    SELECT crash_id
    FROM t_crash_log_main
    WHERE project_id = #{projectId}
      AND log_hash = #{hashValue}
    LIMIT ${i}
</select>