NamedParameterJdbcTemplate не обновляется при использовании batchUpdate - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть список объектов, предоставленных другим сервисом, который я использую для обновления своих собственных данных. Когда я пытаюсь использовать NamedParameterJdbcTemplate.batchUpdate, все возвращаемые значения равны нулю.

public void updateWeather(List<Weather> weatherList) {
    String query = "UPDATE weather \n" +
        "SET rain_probability = ROUND(:rainProbability, 4), \n" +
        "wind_speed = :windSpeed \n" +
        "WHERE city_id = :cityId AND date = :date;";

    List<MapSqlParameterSource> batchList = new ArrayList<>();

    for(Weather weather : weatherList) {
        MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("rainProbability", weather.getRainProbability());
        params.addValue("windSpeed", weather.getWindSpeed());
        params.addValue("cityId", weather.getCityId());
        params.addValue("date", weather.getDate());
        batchList.add(params);
    }

    this.namedParameterJdbcParameter
       .batchUpdate(query, batchList.toArray(new MapSqlParameterSource[] {});
}

Если я запускаю этот UPDATE непосредственно в базе данных, он работает нормально. Кроме того, если я запускаю его один за другим, то есть заменяя значения (вместо добавления источника параметра в batchList), это также работает.

Например:

for (Weather weather : weatherList) {
    String query = String.format("UPDATE weather \n" +
        "SET rain_probability = ROUND('%d', 4), \n" +
        " wind_speed = %d \n" +
        " WHERE city_id = :cityId AND date = :date;",
       weather.getRainProbability(),
       weather.getWindSpeed(),
       weather.getCityId(),
       weather.getDate()
    );

   this.namedParameterJdbcTemplate.update(query, Collections.emptyMap());
}

Есть предложения, что я делаю не так?

1 Ответ

0 голосов
/ 12 февраля 2020

Это использование "\ n" или ";" в конце утверждения в строке? (Я удивлен, что вы не получите SQL синтаксическое исключение с; внутри фактической строки запроса)

Также даты всегда немного сложны, и если это не конвертируется должным образом, тогда ваше предложение WHERE не соответствует и, возможно, поэтому возвращается 0 строк. Не могли бы вы временно попытаться преобразовать даты в строки и посмотреть, является ли счет правильным (например, для Oracle: AND date = TO_DATE (: dateStr, 'DD / MM / YYYY'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...