我在使用 spring 框架的 MapSqlParameterSource 将 null 值传递给 NamedParameterJdbcTemplate 时遇到问题。有人知道该怎么做吗?
目前我的代码是:
String sql = "update person set project = :project where id = :id;";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("project ", null);
params.addValue("id ", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);
这是我得到 NullPointerException 的地方。
这是我在 Spring 3.1 上的代码
String sql = "update user set name = :name where id = :id";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", null);
params.addValue("id", 1);
namedParameterJdbcTemplate.update(sql, params);
工作正常。 也许堆栈跟踪可能有帮助?
在纯jdbc中,其PreparedStatement.setNull(int,java.sql.Types.NULL);
从 MapSqlParameterSource api 有
addValue(String paramName, Object value,int sqlType)
尝试提供 java.sql.Types.NULL 作为 sqlType。
也许这会有所帮助。
参数名称后面多了一个空格:
params.addValue("project ", null);
↑
params.addValue("id ", 1);
↑
问题:Map.of 不支持 null 值,但 HashMap 支持:
String sql = "update person set project = :project where id = :id;";
Map<String, Object> params = new HashMap<>(2);
params.put("project", null);
params.put("id", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);
请确保您的 jdbcTemplate 是否设置了数据源,如下所示 namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
我认为下面的代码中的分号是额外的:
String sql = "update person set project = :project where id = :id;";
删除 id 后面的分号。应该是这样的:
String sql = "update person set project = :project where id = :id";