Spring JdbcTemplate/NamedParameterJdbcTemplate, передающее значение null в качестве значения параметра

У меня проблема с передачей нулевого значения в NamedParameterJdbcTemplate с использованием MapSqlParameterSource структуры spring. Кто-нибудь знает, как это сделать?

В настоящее время мой код:

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.

Ответ 1

Это мой код на 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);

отлично работает. Может быть, трассировка стека может помочь?

Ответ 2

В чистом jdbc его PreparedStatement.setNull(int, java.sql.Types.NULL);
Из MapSqlParameterSource api существует

addValue(String paramName, Object value,int sqlType)

попробуйте предоставить java.sql.Types.NULL как sqlType.

Возможно, это поможет.

Ответ 3

После имени параметра есть дополнительное пространство:

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

Ответ 4

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

// ISSUE: Map.of does not 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);

Ответ 5

Пожалуйста, убедитесь, что для вашего jdbcTemplate задан источник данных, как показано ниже в качестве примера namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (dataSource);

Ответ 6

Я думаю, что точка с запятой добавлена ​​в код ниже:

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

Удалить точку с запятой после id. Он должен выглядеть следующим образом:

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