引起:java.sql.SQLException:列索引无效

时间:2018-03-06 06:28:11

标签: java sql oracle spring-jdbc

我试图通过使用Spring jdbctemplate将2列作为过滤器来删除一条记录。但我不知道下面的代码有什么问题。我在下面提到了例外情况。我检查了重复数据删除,requestId和qtId值即将到来。

public void deleteTxn(String sql, int requestId, int qtId) {
    try {
            jdbcTemplate.update(sql,
                    new Object[]{
                    requestId,
                    qtId
                    }); 
        } catch(Exception e) {
            //
        }
    }
}

String sql = "DELETE FROM TABLE1 WHERE COL1 = ? AND COL2 = ?";

例外:

  

org.springframework.jdbc.InvalidResultSetAccessException:   PreparedStatementCallback; SQL的无效ResultSet访问权限[DELETE   FROM TABLE1 WHERE COL1 =? AND COL2 =?];嵌套异常是   java.sql.SQLException:列索引无效   org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235)     在   org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)     在   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:909)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:970)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:980)

1 个答案:

答案 0 :(得分:3)

jdbcTemplate.update有两个类似的方法签名:

  • update(java.lang.String sql, java.lang.Object... args)

  • update(java.lang.String sql, java.lang.Object[] args, int[] argTypes)

在您的情况下,选择第一个重载方法是因为您没有提供int[] argTypes,因此您的更新语句只有一个参数,即new Object[]{requestId, qtId}

解决方案很简单:只需编写jdbcTemplate.update(sql, requestId, qtId);

即可

或者,如果您想提供类型,请执行以下操作:

jdbcTemplate.update(sql, new Object[]{requestId, qtId}, 
                         new int[]{Types.BIGINT, Types.BIGINT});