IT이야기

Spring의 JDB로 IN() SQL 쿼리를 실행하는 방법CTEMplate 효과적?

cyworld 2022. 5. 16. 21:05
반응형

Spring의 JDB로 IN() SQL 쿼리를 실행하는 방법CTEMplate 효과적?

스프링의 JDB로 IN() 질의를 할 수 있는 더 우아한 방법이 있는지 궁금했다.CTemplate.현재 나는 다음과 같은 일을 하고 있다.

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()활자의 예를 반환하다.

나는 다음과 같은 봄 jdbc로 "in section" 질의를 한다.

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년 이후 많은 것들이 바뀌었지만, NamedParametersJDB를 사용해야 한다는 답변만 찾을 수 있다.CTemplate.

나한텐 그냥 하면 돼.

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

SimpleJDB 사용CTEMplate 또는 JDBCTemplate

참조URL: https://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs-jdbctemplate-effectively

반응형