Как эффективно выполнять запросы IN () SQL с помощью Spring JDBCTemplate? - PullRequest
165 голосов
/ 25 августа 2009

Мне было интересно, есть ли более элегантный способ выполнения запросов 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 (). Я хотел бы иметь что-то вроде подстановки параметров готовых операторов

Ответы [ 5 ]

242 голосов
/ 25 августа 2009

Вы хотите источник параметра:

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

52 голосов
/ 08 февраля 2012

Я делаю запрос "in clause" с пружиной 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);
16 голосов
/ 13 мая 2014

Если вы получаете исключение для: Неверный тип столбца

Пожалуйста, используйте getNamedParameterJdbcTemplate() вместо getJdbcTemplate()

 List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
 getRowMapper());

Обратите внимание, что вторые два аргумента поменялись местами.

1 голос
/ 08 февраля 2015

См. здесь

написать запрос с именованным параметром, использовать простой 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;
0 голосов
/ 30 сентября 2016

С 2009 года многое изменилось, но я могу только найти ответы о том, что вам нужно использовать NamedParametersJDBCTemplate.

Для меня это работает, если я просто

db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));

с использованием SimpleJDBCTemplate или JDBCTemplate

...