java - 获取 java.sql.SQLFeatureNotSupportedException:不支持的功能:checkValidIndex 异常
问题描述
在以下代码下运行时出现异常。它是用 Java 8 编写的,并使用 ojdbc8 jar 进行数据库连接。db 是 Oracle 12.2.0.1.0。
String insertQuery = generateSql(Utils.getStringArray(ApplicationConstants.INSERT_REQUEST_RESPONSE));
srpJdbcTemplate.update(insertQuery,new Object[] { null, broadSoftResponse.getTransType(), broadSoftResponse.getRequestXml(),
broadSoftResponse.getResponseXml(), null, null, null, null, null,
ApplicationConstants.SOURCE_SYSTEM, ApplicationConstants.SOURCE_SYSTEM_ID,
broadSoftResponse.getTrackingId(), null });
并使用查询 - INSERT INTO INTERFACE_TRANS(INT_TRANS_ID,ORD_NP_DETAIL_ID,TRANS_TYPE,REQUEST,RESPONSE,STATUS,ERROR_CODE,ERROR_MESSAGE,START_TIME,END_TIME,SOURCE_SYSTEM,SOURCE_SYSTEM_ID,TRACKING_ID,REF1) VALUES(SRP.INT_TRANS_ID_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?)
例外——
org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [INSERT INTO SRP.INTERFACE_TRANS(INT_TRANS_ID,ORD_NP_DETAIL_ID,TRANS_TYPE,REQUEST,RESPONSE,STATUS,ERROR_CODE,ERROR_MESSAGE,START_TIME,END_TIME,SOURCE_SYSTEM,SOURCE_SYSTEM_ID,TRACKING_ID,REF1) VALUES(SRP.INT_TRANS_ID_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?)]
org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
org.springframework.jdbc.core.StatementCreatorUtils - Could not check database or driver name
java.sql.SQLFeatureNotSupportedException: Unsupported feature: checkValidIndex
at oracle.jdbc.driver.OracleParameterMetaData.checkValidIndex(OracleParameterMetaData.java:196)
at oracle.jdbc.driver.OracleParameterMetaData.getParameterType(OracleParameterMetaData.java:307)
at org.springframework.jdbc.core.StatementCreatorUtils.setNull(StatementCreatorUtils.java:241)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:214)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:145)
at org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65)
at org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:816)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:1)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)
你能否分享你的想法来解决这个问题。
解决方案
update(String sql, Object... args)
当你有空值时不要使用,update(String sql, Object[] args, int[] argTypes)
而是使用,这样你就可以知道JdbcTemplate
值类型是什么。
这样它就不需要getParameterType
为空值调用 JDBC 方法。
例子
srpJdbcTemplate.update(insertQuery, new Object[] {
null, broadSoftResponse.getTransType(), broadSoftResponse.getRequestXml(),
broadSoftResponse.getResponseXml(), null, null, null, null, null,
ApplicationConstants.SOURCE_SYSTEM, ApplicationConstants.SOURCE_SYSTEM_ID,
broadSoftResponse.getTrackingId(), null
}, new int[] {
Types.INTEGER, Types.INTEGER, Types.VARCHAR,
Types.VARCHAR, Types.DATE, Types.DATE, Types.INTEGER, Types.VARCHAR, Types.VARCHAR,
Types.VARCHAR, Types.INTEGER,
Types.INTEGER, Types.VARCHAR
});
当然,不知道您的列类型实际上是什么,这只是一个示例。
推荐阅读
- amazon-web-services - 尽管 CPU 实例使用率很低,但 AWS 应用程序非常缓慢且滞后
- wpf - C#WPF - 在添加/删除时绑定更新但不是在更新时
- python - Python中while循环中的默认(整数)用户输入
- excel - 需要在循环中分配一张票,并保持最后分配和成员休假保持计算
- typescript - 获取类的名称作为字符串的联合类型
- c# - C# 存储过程不会保存数据
- arrays - 创建一个函数,它将告诉我们在 C 编程中数组是否已排序
- javascript - JavaScript 中的 forEach 和 map
- angular - 如何使用 ng-bootstrap 在日期时间格式为 yyyy-mm-ddTHH:mm:ss.sssZ 的单个弹出窗口中添加日期选择器和时间选择器?
- reactjs - 如何使用 Fetch 和 React 发布表单数据?