Как выполнить 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