当前位置: 首页 > article >正文

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

问题

执行更新sql时报错,异常栈如下

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLException: No value specified for parameter 4
### The error may exist in com/my/mapper/MyMapper.java (best guess)
### The error may involve com.my.mapper.MyMapper.updateById-Inline
### The error occurred while setting parameters
### SQL: UPDATE my_table  SET col1=?, col2=?, col3=?,   col4=? WHERE id=?
### Cause: java.sql.SQLException: No value specified for parameter 4
; bad SQL grammar []; nested exception is java.sql.SQLException: No value specified for parameter 4
Statement [truncated]: UPDATE my_table  SET col1='xxx',\ncol2='',\ncol3='',\n\n\ncol4=null

注意,占位符索引是从1开始的,所以这里的parameter 4,是col4;提示信息是未设置col4;

col4字段,数据类型是个json格式的字符串,数据类型是varchar(设置为json更合理),为了查询出来字符串自动转为对象;更新数据时,将对象转为字符串;所以自定义了Mybatis的BaseTypeHandler

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
@MappedJdbcTypes({JdbcType.LONGVARCHAR})
@MappedTypes({List.class})
public class CustomTypeHandler extends BaseTypeHandler<List<CustomInfo>> {
	@Override
	public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<CustomInfo> customInfos, JdbcType jdbcType) throws SQLException {
		if (customInfos == null || customInfos.isEmpty() || !JdbcType.LONGVARCHAR.equals(jdbcType)) {
			return;
		}
		String str = JSON.toJSONString(customInfos);
		preparedStatement.setString(i, str);
	}

}

解决

根据提示信息,自然而然的就知道,需要设置下值
修改后

if (customInfos == null || customInfos.isEmpty() || !JdbcType.LONGVARCHAR.equals(jdbcType)) {
	//没有值或者空集合,根据实际情况,设置为null
	preparedStatement.setString(i,null);
	return;
}

http://www.kler.cn/a/418829.html

相关文章:

  • Docker for Everyone Plus——No Enough Privilege
  • 关于ConstarintLayout有关的点
  • 【云原生系列】迁移云上需要考虑哪些问题
  • python股票数据分析(Pandas)练习
  • Java学习,数据结构
  • 玄机应急:Apache日志分析Mysql应急Redis应急
  • 【机器学习】梯度消失和梯度爆炸问题
  • pytorch中一个tensor经过多次softmax会有什么变化?
  • 【Linux课程学习】:《简易版shell实现和原理》 《哪些命令可以让子进程执行,哪些命令让shell执行(内键命令)?为什么?》
  • Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
  • 未来已来!联想推出汽车智能空间解决方案
  • PWN的简单了解
  • 逆向攻防世界CTF系列42-reverse_re3
  • 论文解读:Reward criteria impact on the performance ofreinforcement learning...
  • Hbase2.2.7集群部署
  • 阿里云CPU过载的一点思考
  • 深度学习模型: BERT(Bidirectional Encoder Representations from Transformers)详解
  • word文档ctrl+v失效的解决方法
  • Lumos学习王佩丰Excel第十八讲:LOOKUP函数与数组
  • 网络安全-网络安全审计
  • C# 2024年Visual Studio实用插件集合
  • Oracle—系统包使用
  • SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo
  • 永久停用PostgreSQL 归档功能
  • Linux——自定义简单shell
  • day05 Linux bash核心及目录命令