Spring JdbcTemplate / NamedParameterJdbcTemplate 传递 null 值作为参数值

问题描述 投票:0回答:6

我在使用 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 jdbc jdbctemplate
6个回答
17
投票

这是我在 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);

工作正常。 也许堆栈跟踪可能有帮助?


13
投票

在纯jdbc中,其PreparedStatement.setNull(int,java.sql.Types.NULL);
从 MapSqlParameterSource api 有

addValue(String paramName, Object value,int sqlType)

尝试提供 java.sql.Types.NULL 作为 sqlType。

也许这会有所帮助。


11
投票

参数名称后面多了一个空格:

params.addValue("project ", null);
                        ↑   
params.addValue("id ", 1);
                   ↑

3
投票

Map.of() 不支持 null

问题: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);

-1
投票

请确保您的 jdbcTemplate 是否设置了数据源,如下所示 namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);


-2
投票

我认为下面的代码中的分号是额外的:

String sql = "update person set project = :project where id = :id;";

删除 id 后面的分号。应该是这样的:

String sql = "update person set project = :project where id = :id";
© www.soinside.com 2019 - 2024. All rights reserved.