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 사용