使用batchUpdate时NamedParameterJdbcTemplate不更新

时间:2020-02-12 14:32:43

标签: java database

我有一个由其他服务提供的对象列表,可用于更新自己的数据。当我尝试使用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 :(得分:0)

使用“ \ n”还是“;”在字符串中的语句末尾? (我很惊讶您没有在实际查询字符串中得到带有;的SQL语法异常)

日期也总是有些棘手,如果转换不正确,则您的WHERE子句将不匹配,这可能是为什么返回0行的原因。您可以暂时尝试将日期转换为字符串并查看计数是否正确(例如,对于Oracle:AND date = TO_DATE(:dateStr,'DD / MM / YYYY'))