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

时间:2012-02-15 02:01:16

标签: spring jdbc jdbctemplate

我有一个问题是使用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的地方。

6 个答案:

答案 0 :(得分:12)

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

工作正常。 堆栈跟踪可能会有所帮助吗?

答案 1 :(得分:8)

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

addValue(String paramName, Object value,int sqlType)

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

可能会有所帮助。

答案 2 :(得分:6)

参数名称后面有一个额外的空格:

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

答案 3 :(得分:0)

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

// ISSUE: Map.of doesn't support null values, but HashMap does:
Map<String, Object> params = new HashMap<>();
params.put("project", null);
params.put("id", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

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

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

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

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