java - springframework.jdbc.UncategorizedSQLException :Invalid column type- 错误

标签 java sql spring-jdbc

您好,我正在尝试使用 spring jbdc 执行 QueryForInt。查询返回一个简单的计数。执行时我得到 springframework.jdbc.UncategorizedSQLException:java.sql.SQLException: 列类型无效。 我确实找到了类似的帖子并尝试了这些建议,但我仍然卡住了:(... 感谢您的帮助。

MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue(DAOConstants.PROD_ID, custVo.getProdId(),OracleTypes.NUMBER);
    params.addValue(DAOConstants.REQ_IND,  DAOConstants.FLAG_Y,OracleTypes.VARCHAR);

查询:

  select count(1) from prod where prod_id = :PROD_ID and req_ind =:REQ_IND

表定义

   Name              Null     Type         
   ----------------- -------- ------------ 
   PROD_ID           NOT NULL NUMBER(5)          
   REQ_IND                    VARCHAR2(10) 

日志..

  Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; 
uncategorized SQLException for SQL [select count(1) from prod where prod_id = :PROD_ID and req_ind = :REQ_IND ]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:728)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:744)
    at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:775)
    ... 45 more
Caused by: java.sql.SQLException: Invalid column type
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7937)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7517)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8174)
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:8155)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230)
    at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setObject(WrappedPreparedStatement.java:724)
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144)
    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$1.doInPreparedStatement(JdbcTemplate.java:641)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)
    ... 56 more

最佳答案

根据堆栈跟踪,您似乎正在使用 JdbcTemplate 类。由于您正在使用命名参数样式占位符并为您需要使用 NamedParameterJdbcTemplate 的参数提供 MapSqlParameterSource。

那么,您为什么会收到这个奇怪的错误消息?那么,您的 SQL 查询实际上使用 Oracle JDBC 驱动程序工作。它确实允许您使用“?”或使用“:”作为占位符前缀的命名参数样式。您仍然需要以正确的顺序提供参数值,而您的情况下的 MapSqlParameterSource 则不需要。您可以使用对象数组来测试它,例如:

new Object[] {custVo.getProdId(), DAOConstants.FLAG_Y}

错误是基于来自 params.getValues() 方法的值以错误的顺序出现,并为 :PROD_ID 传入了字符串值。

关于java - springframework.jdbc.UncategorizedSQLException :Invalid column type- 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114562/

相关文章:

mysql - 将 MySQL 查询存储为函数

java - Java 是否提供 'friend' 访问修饰符?

java - 将日期时间插入 Cassandra

java - 不同用例的不同 CascadeType 值

sql - 如何从参数开始并按顺序递增的表字段中查找缺失的数字?

mysql - 出于用户授权目的,如何处理数据库中的大量记录存储?

java - 使用 JDBC 更新数据库,其中包含一些应忽略的值

java - 行映射器是最好的吗?

SQL根据时区查询日期

java.lang.IllegalArgumentException : Property 'transactionManager' is required 异常