IT story

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

hot-time 2020. 5. 26. 07:48
반응형

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

참고 : https://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs-jdbctemplate-effectivly

반응형