我有一个由其他服务提供的对象列表,可用于更新自己的数据。当我尝试使用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());
}
关于我在做什么错的任何建议?
答案 0 :(得分:0)
使用“ \ n”还是“;”在字符串中的语句末尾? (我很惊讶您没有在实际查询字符串中得到带有;的SQL语法异常)
日期也总是有些棘手,如果转换不正确,则您的WHERE子句将不匹配,这可能是为什么返回0行的原因。您可以暂时尝试将日期转换为字符串并查看计数是否正确(例如,对于Oracle:AND date = TO_DATE(:dateStr,'DD / MM / YYYY'))