2010-05-11 2 views
4

я следующий код:Как выполнить запрос с предложением IN весной?

try { 
      MapSqlParameterSource parameters = new MapSqlParameterSource(); 
      parameters.addValue("ids", year); 

      return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=? AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 


     }catch (EmptyResultDataAccessException ex) { 
      return null; 
     } 

Но я не могу отправить значение для PROVNUM. как это сделать?

нужна помощь, спасибо.

+2

Конкретная проблема не имеет ничего общего с предложением IN. – BalusC

ответ

4

Просто используйте именованный параметр для «provnum» также:

String sql = "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)" 
MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", ...); 
return template.getJdbcOperations().query(sql, rowMapper, parameters); 
+0

Получение этого выполнения org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT * FROM INCOME WHERE PROVNUM =: provNum И FISCALDATE IN (: ids)]; Невозможно преобразовать между org.springframework.jdbc.core.namedparam.MapSqlParameterSource и JAVA_OBJECT .; Вложенное исключение - java.sql.SQLException: Невозможно преобразовать между org.springframework.jdbc.core.namedparam.MapSqlParameterSource и JAVA_OBJECT. – GuruKulki

+0

Документация по SpringSource по этому вопросу может быть найдена: http://static.springsource.org/spring/docs/2.5.x/reference/jdbc.html#jdbc-in-clause Убедитесь, что вы используете коллекцию реализация интерфейса List и что вы не используете пользовательский объект. Чтобы быть правдивым, я не пробовал это со списком дат, но пример Мэтта будет работать для List , List и т. Д. – jnt30

+0

@GK, пожалуйста, разместите этот код, включая типы/значения любых параметров, которые вы добавляете с помощью 'addValue()' –

9

Похоже, что вы смешиваете с именем и параметры позиционирования. Лучше использовать тот или иной, но не тот и другой.

Попробуйте

MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", provnum); 

return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 

После Вашего комментария, я вижу, что вы используете неправильную перегрузку метода query(): есть довольно много, чтобы выбрать из, так что не удивительно, несколько ошибок может ползти в!

Вам нужно позвонить

return this.template.getJdbcOperations().query(
     "SELECT ... etc.", parameters, this.rowMapper); 

В оригинальном вызове, вы вызываете версию query(String sql, RowMapper mapper, Object... params), что ожидает буквенные параметры. Пересмотренный вызов - это запрос (String sql, SqlParameterSource params, RowMapper mapper) - ключ SqlParamtersSource в качестве второго аргумента. Также стоит проверить, что вы используете NamedParameterJdbcTemplate.

+1

Я думаю, что это ключ, убедитесь, что вы используете NamedParameterJdbcTemplate, обычный JdbcTemplate не поддерживает именованные параметры. – mezmo

Смежные вопросы