(JAVA) JDBC Template несколько переменных через IN в select

Рейтинг: 2Ответов: 1Опубликовано: 30.05.2023

Не получается передать значение в переменную in в select, для подключения к базе использую JDBC Template.

Пример запроса:

    public List<Clnt> getClnt(String codeStr , String clnt){
    List<Cities> clntList;
    String SQL = "select * from clnt where CODE in (:codeStr ) and CLNT_ID in (:clnt)"
    
    try {
        citiesList = jdbcTemplate.query(SQL,
            new Object[]{codeStr,clnt},
            new BeanPropertyRowMapper<>(Clnt.class));
    } catch (Exception err) {
        logger.error(err);
    }
        return clntList ;
    }

Если передавать в переменные по одному параметру codeStr=123asd и clnt=123 запрос отрабатывает , но если в запрос передаются несколько значений codeStr=123asd,456fgh и clnt=123,321 или в какию то переменную один параметр а в другой 2, то запрос не отрабатывает.

Ответы

▲ 1Принят

Вариант с использованием NamedParameterJdbcTemplate потребует преобразования строк со значениями "v1, v2, vN" в список [v1, v2, vN] и создания мапы параметров MapSqlParameterSource в качестве реализации SqlParameterSource:

private NamedParameterJdbcTemplate npTemplate;

public void setDataSource(DataSource dataSource) {
    this.npTemplate = new NamedParameterJdbcTemplate(dataSource);
}

public List<Clnt> getClnt(String codes, String clnt) {
    SqlParameterSource params = new MapSqlParameterSource(Map.of(
        "codes", Arrays.asList(codes.split(",\\s*")),
        "clnt",  Arrays.stream(clnt.split(",\\s*"))
                       .map(Integer::valueOf)
                       .collect(Collectors.toList())
    ));
    
    try {
        return npTemplate.query(
            "select * from clnt where CODE in (:codes) and CLNT_ID in (:clnt)",
            params,
            new BeanPropertyRowMapper<>(Clnt.class));
    } catch (Exception err) {
        logger.error(err);
        throw new RuntimeException("Query failed", err);
    }
}