Spring NamedJDBCTemplate执行插入语句时会为SQL提供未分类的SQLException

时间:2019-02-19 21:36:39

标签: java spring

尝试使用名为JDBCTemplate的弹簧插入时出现以下错误。

相同的代码在我的本地Windows机器上运行(在jboss服务器中部署)。 但是不能在UNIX盒中使用(在Jboss服务器中部署)。 数据源由jboss服务器创建,并使用ojdbc6.jar。

该语句中发送的number参数与需要插入的参数相同。 有这个想法吗?

代码:`

@RestController
public class Test_A {

@Autowired
private PlatformTransactionManager transactionManager;

@RequestMapping(value="/addTable_A", method = RequestMethod.POST)
public @ResponseBody List<Response> addTable_A(@RequestBody RequestForm[] forms) {      

    TransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(def);

        MapSqlParameterSource parameters = new MapSqlParameterSource();
        KeyHolder holder = new GeneratedKeyHolder();

        for (Map.Entry<String, Object> entry : rowData.entrySet()) {
            parameters = parameters.addValue(entry.getKey(), entry.getValue(),Types.VARCHAR);
            getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + "KEY : "+entry.getKey()+" , VALUE : "+entry.getValue());              
        }
        getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + " Before Insert -- QUERY USED :: >> " + query.toString());

        int res = 0;
        try{
            res = namedJdbcTemplate.update(query.toString(), parameters, holder, new String[] { "id" });
        }catch(Throwable t){
            StringWriter sw = new StringWriter();
            t.printStackTrace(new PrintWriter(sw));
            String  exceptionAsString = sw.toString();
            getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + "In exception bloack of insert 3.3"+exceptionAsString);
        }finally{
            transactionManager.commit(status);  
        }           
    }
}

`

错误:`

21 09:57:09.448 com.test.Test_A [278]:addTable_A:KEY:A,VALUE:A1

21 09:57:09.448 com.test.Test_A [278]:addTable_A:KEY:B,VALUE:B1

21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:C,VALUE:C1

21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:D,VALUE:D1

21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:E,VALUE:E1

21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:F,VALUE:F1

21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:ID,VALUE:

21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:G,VALUE:G1

21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:H,VALUE:H1

21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:I,VALUE:I1

21 09:57:09.451 com.test.Test_A [287]:validateInputData:插入之前-查询已使用:: >>插入到table_A(A,B,C,D,E,F,ID,G, H,I)值(:A,:B,:C,:D,:E,:F,:ID,:G,:H,:I)

21 09:57:09.559 com.test.Test_A [297]:validateInputData:在插入中出现异常3.3org.springframework.jdbc.UncategorizedSQLException:PreparedStatementCallback; SQL的未分类SQLException [插入table_A(A,B,C,D,E,F,ID,G,H,I,J)值(?,?,?,?,?,?,?,?,?,? ,?,sysdate)]; SQL状态[null];错误代码[0];错误;嵌套异常为java.sql.SQLException:错误     在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)     在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)     在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)     在org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645)     在org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:900)     在org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:318)

`

1 个答案:

答案 0 :(得分:0)

您指定在一个环境中可以正常运行,而在另一个环境中则不能运行。
在这种情况下,要做的第一件事就是明确指定参数的类型。

由于NamedParameterJdbcTemplate#update接受SqlParamaterSource,我想您正在使用MapSqlParameterSource,因此您可能要使用

addValue(String paramName, Object value, int sqlType)

添加参数的方法。您可以在java.sql.Types下找到SQL类型。


无论如何,正如我在评论中所写的那样,发布执行的SQL语句和参数的映射。