(JAVA) JDBC Template несколько переменных через IN в select
Не получается передать значение в переменную 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 шт):
Автор решения: Nowhere Man
→ Ссылка
Вариант с использованием 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);
}
}