[java] Spring의 JDBCTemplate을 사용하여 IN () SQL 쿼리를 효과적으로 실행하는 방법은 무엇입니까?

Spring의 JDBCTemplate을 사용하여 IN () 쿼리를 수행하는보다 우아한 방법이 있는지 궁금합니다. 현재 나는 그런 식으로합니다 :

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 () 쿼리에 대한 절을 작성하기 위해 9 줄이 있으면 상당히 고통 스럽습니다. 준비된 문장의 매개 변수 대체와 같은 것을 원합니다.



답변

매개 변수 소스를 원합니다.

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


답변

스프링 jdbc를 사용하여 “in clause”쿼리를 다음과 같이 수행합니다.

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);


답변

다음에 대한 예외가 발생하는 경우 : 유효하지 않은 열 유형

getNamedParameterJdbcTemplate()대신에 사용하십시오getJdbcTemplate()

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

두 번째 두 인수는 서로 바뀌 었습니다.


답변

여기를 참조 하십시오

명명 된 매개 변수를 사용하여 쿼리를 작성 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;


답변

2009 년 이후 많은 것이 바뀌었지만 NamedParametersJDBCTemplate을 사용해야한다는 답변 만 찾을 수 있습니다.

나를 위해 내가 그냥하면 작동합니다

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

SimpleJDBCTemplate 또는 JDBCTemplate 사용


답변