Как выполнить IN() SQL-запросы с помощью Spring JDBCTemplate effectivly?
Мне было интересно, есть ли более элегантный способ делать запросы IN() с помощью Spring JDBCTemplate. В настоящее время я делаю что-то вроде этого:
StringBuilder jobTypeInClauseBuilder = new StringBuilder();
for(int i = 0; i < jobTypes.length; i++) {
Type jobType = jobTypes[i];
if(i != 0) {
jobTypeInClauseBuilder.append(',');
}
jobTypeInClauseBuilder.append(jobType.convert());
}
Это довольно болезненно, поскольку, если у меня есть девять строк только для построения предложения для запроса IN(). Я хотел бы иметь что-то вроде замены параметров подготовленных операторов
Ответы
Ответ 1
Вам нужен источник параметров:
Set<Integer> ids = ...;
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);
List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",
parameters, getRowMapper());
Это работает, только если getJdbcTemplate()
возвращает экземпляр типа NamedParameterJdbcTemplate
Ответ 2
Я делаю запрос "in clause" с spring jdbc следующим образом:
String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid IN (:goodsid)";
List ids = Arrays.asList(new Integer[]{12496,12497,12498,12499});
Map<String, List> paramMap = Collections.singletonMap("goodsid", ids);
NamedParameterJdbcTemplate template =
new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());
List<Long> list = template.queryForList(sql, paramMap, Long.class);
Ответ 3
Если вы получаете исключение для: Недопустимый тип столбца
Используйте getNamedParameterJdbcTemplate()
вместо getJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
Обратите внимание, что два вторых аргумента меняются местами.
Ответ 4
Обратитесь сюда
написать запрос с именованным параметром, использовать простой ListPreparedStatementSetter
со всеми параметрами в последовательности. Просто добавьте ниже фрагмент кода, чтобы преобразовать запрос в традиционной форме на основе доступных параметров,
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(namedSql);
List<Integer> parameters = new ArrayList<Integer>();
for (A a : paramBeans)
parameters.add(a.getId());
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("placeholder1", parameters);
// create SQL with ?'s
String sql = NamedParameterUtils.substituteNamedParameters(parsedSql, parameterSource);
return sql;
Ответ 5
С 2009 года многое изменилось, но я могу найти ответы только на то, что вам нужно использовать NamedParametersJDBCTemplate.
Для меня это работает, если я просто делаю
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
используя SimpleJDBCTemplate или JDBCTemplate