Получите исключение PSQL при передаче List <String>в качестве параметра запроса в предложении "IN" с использованием JDBCTemplate - PullRequest
0 голосов
/ 05 июля 2019

Я создаю приложение Spring Boot с базой данных PostgreSQL. и я использую JDBCTemplate для выполнения операций с БД. согласно моему требованию, я хочу count таблицы row из CONTRACT_VIEW_2, где значения LICENSE_PLATE = "xxxxxx" и ZONE_CODE is IN ("x","y","z"), но я получаю исключение PSQL.

Я пытался использовать MapSQLParameterSource, но все же столкнулся с проблемой.

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) {
  MapSqlParameterSource zoneIds = new MapSqlParameterSource();
  zoneIds.addValue("zoneIds",zones);
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (?)";
  return jdbcTemplate.queryForObject(sql,Integer.class,lp,zoneIds);
}

Я ожидаю row count в результате, но я получаю PSQL Exception. Я прилагаю изображение исключения, которое я получаю.

enter image description here

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Проблема с вашим заключается в том, что вы добавили Namedparameter к JdbcTemplate.

Таким образом, если вы используете NamedParameterJdbcTemplate

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) {
  MapSqlParameterSource parameters = new MapSqlParameterSource();
  parameters.addValue("lp", lp);
  parameters.addValue("zoneIds",zones);
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = :lp and zone_code IN (:zoneIds)";
  NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);

  return namedParameterJdbcTemplate.queryForObject(sql, parameters, Integer.class);
}

Если вы хотите использовать jdbcTemplate

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) {
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (?)";

  return jdbcTemplate.queryForObject(sql, Integer.class, new Object[] { lp, zones}); 
}

Перейдите с NameParameterJdbcTemplate, чтобы не пропустить ни одного параметра.

0 голосов
/ 05 июля 2019

Пожалуйста, измените ваш запрос на

  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (:zoneIds)";

Изменения: изменены? to: zoneIds

Строка zoneIds.addValue("zoneIds",zones); использует именованный параметр для его привязки.

...