NamedParameterJdbcTemplate的意外行为

时间:2015-08-24 21:42:10

标签: oracle spring-jdbc jdbctemplate named-parameters

我使用的是Spring的NamedParameterJdbcTemplate包装器。

我已将一个dealno插入(Oracle)数据库并使用Oracle SQL Developer进行验证。

当我有一个固定的查询来选择该dealno(以及一个无用的namedParameter)时,我得到一个预期的计数1.(注意,当我使用JdbcTemplate时,我也得到预期的计数为1。)

当我使用SqlParameterSource和必要的namedParameter时,我得到意外的数量为0.

这是一段代码片段。

String sqlBegin = "select count(*) FROM " + SCHEMA_NAME + "." + TABLE_NAME + " WHERE dealno = ";
String sql = sqlBegin + ":dealno";
String dealnoStr = "24324965";
String noParamSql = sqlBegin + "'" + dealnoStr + "'"; // WHERE dealno = '24324965'

SqlParameterSource namedParameters = new MapSqlParameterSource("dealno", dealnoStr);

Integer noParamCount = parameterJdbcTemplate.queryForObject(noParamSql, namedParameters, Integer.class); // no namedParameter substitution occurring.
// Debug: noParamCount is 1

Integer count = parameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
// Debug: count is 0

用于具有RowMapper和复杂对象的queryForObject的代码。

1 个答案:

答案 0 :(得分:0)

Error Inserting Java Character object value into Oracle CHAR(1) column处有一个很好的提示来回答这个问题。

我的问题是dealno没有映射到Java String,因为它是一个CHAR(15),而不是一个varchar。

解决方案是在SQL语句中CAST the dealno,如:

 "WHERE DEALNO = CAST(:dealno as CHAR(15))"

因此NamedParameterJdbcTemplate为您处理大量事情,但不是从Java String到固定长度CHAR的转换。让买家小心。