Проблема с шаблоном Java Spring JDBC - PullRequest
3 голосов
/ 29 апреля 2011
public List<Weather> getWeather(int cityId, int days) {
    logger.info("days: " + days);
    return getSimpleJdbcTemplate().query("SELECT weather.id, cities.name, weather.date, weather.degree " +
                                        "FROM weather JOIN cities ON weather.city_id = cities.id " +
                                        "WHERE weather.city_id = ? AND weather.date BETWEEN now()::date AND (now() + '? days')::date",
                                        this.w_mapper, cityId, days);
}

ошибка:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT weather.id, cities.name, weather.date, weather.degree FROM weather JOIN cities ON weather.city_id = cities.id WHERE weather.city_id = ? AND weather.date BETWEEN now()::date AND (now() + '? days')::date]; The column index is out of range: 2, number of columns: 1.; nested exception is org.postgresql.util.PSQLException: The column index is out of range: 2, number of columns: 1.

работает с:

public List<Weather> getWeather(int cityId, int days) {
    logger.info("days: " + days);
    return getSimpleJdbcTemplate().query("SELECT weather.id, cities.name, weather.date, weather.degree " +
                                        "FROM weather JOIN cities ON weather.city_id = cities.id " +
                                        "WHERE weather.city_id = ? AND weather.date = now()::date",
                                        this.w_mapper, cityId);
}

, поэтому проблема в том, что я использую два?оценки в моем запросе.как я могу заставить его работать с 2?знаки ???

Ответы [ 3 ]

6 голосов
/ 29 апреля 2011

Проблема, вероятно, в этой части:

'? days'

Знак вопроса находится внутри литеральной строки, поэтому он не распознается синтаксическим анализатором sql. Вы можете попробовать переписать его, используя оператор конкатенации строк, хотя я не уверен на 100%, что в этом случае допустимый синтаксис.

Согласно этой странице на postgreswiki вы можете просто пропустить строку 'days', поскольку добавление даты и целого числа интерпретируется как добавление указанного количества дней.

BETWEEN now()::date AND now()::date + ?
5 голосов
/ 29 апреля 2011

Переписать часть SQL

AND weather.date BETWEEN now()::date AND (now() + '? days')::date

в

AND weather.date BETWEEN now()::date AND ?

и установите его с полным значением java.sql.Date вместо days.

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, days);
Date endDate = new Date(calendar.getTimeInMillis());
// ...

(еще раз, это java.sql.Date, а не java.util.Date!)

0 голосов
/ 29 апреля 2011

Ошибка говорит о том, что у вас есть только 1 параметр (т. Е.?) В первом операторе sql, но вы передаете два аргумента. Спринг не знает, что делать со вторым аргументом.

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