我使用的是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的代码。
答案 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的转换。让买家小心。