[SPRING] RowMapper에서 쿼리 사용하기
SPRINGRowMapper에서 쿼리 사용하기
자바에서 나는 결과 집합을 반복하고 쿼리를 형성하기 위해 아래와 같이 할 것이다.
public Map<String, List<MODEL>> fun(){
Map<String, List<MODEL>> map = new TreeMap<String, List<MODEL>>();
LinkedHashSet<String> set = new LinkedHashSet<String>();
String sql = "select distinct(column) from table where conditions orderby column ";
ResultSet rslt = stmt.executeQuery(sql);
while (rslt.next()) {
al.add(rslt.getString(1));
}
for (String s : al) {
List<MODEL> list = new ArrayList<MODEL>();
String sql2 = "select * from table where column="+s;
ResultSet rslt2 = stmt.executeQuery(sql2);
while (rslt2.next()) {
MODEL obj = new MODEL();
// set values to setters from resultset
list.add(obj);
}
map.put(s, list);
}
return map;
}
내가 별도의 쿼리를 사용한 이유는지도의 값에 맵 키와 해당 값 (목록)에 고유 한 값을 추가하려고하기 때문입니다. 참고 (결과적으로 column1의 중복 값이 있음) 그러나 나는 그들을지도 키로 저장하고 따라서 그것을 독특하게 만들 필요가있다. 또한 모든 관련 값이 필요하므로 목록 채우기가 필요합니다.
JdbcTemplate을 사용하여 동일한 기능을 어떻게 얻을 수 있습니까?
미리 감사드립니다.
해결법
-
==============================
1.여러 사람이 말했듯이 솔루션이 효율적이지는 않지만 기본적으로 1 + N select 문제의 함정에 빠지게됩니다. 1 쿼리는 일부 ID를 검색하고 각 ID는 다른 쿼리를 검색합니다 (따라서 1 + N select).
여러 사람이 말했듯이 솔루션이 효율적이지는 않지만 기본적으로 1 + N select 문제의 함정에 빠지게됩니다. 1 쿼리는 일부 ID를 검색하고 각 ID는 다른 쿼리를 검색합니다 (따라서 1 + N select).
한 번에 모든 것을 검색하는 단일 쿼리를 작성하는 것이 좋습니다. 코드를 살펴보면 다음과 같은 두 개의 쿼리가 있으며,이 쿼리는 동일한 테이블에서 작동합니다.
String sql1 = "select distinct(column) from table where conditions orderby column "; String sql2 = "select * from table where column="+s
이제 첫 번째 쿼리를 두 번째 쿼리의 subselect로 만들거나
String sql = "select * from table where column in (select distinct(column) from table where conditions) order by column";
그러나 다시 살펴보면 두 번째 쿼리에 where 절을 넣는 것이 가능할 수도 있습니다 (또는 더 쉽습니다).
String sql = "select * from table where conditions order by column";
이제지도에서 키에 여러 값을 가져옵니다. 결과에 대해 ResultSetExtractor 루프를 사용하거나 반복을 수행하는 RowCallbackHandler를 사용하여 두 가지 작업을 수행 할 수 있습니다.
당신이해야 할 일은 단지 결과가 반복되는 것입니다 (또는 JdbcTemplate이 당신을 대신해줍니다).리스트가 이미 존재한다면, 키 컬럼을 확인하십시오. 첫 번째로 목록을 만들고 결과 맵에 추가하지 않는 경우 행을 추가합니다.
public Map<String, List<MODEL>> fun(){ final Map<String, List<MODEL>> map = new TreeMap<String, List<MODEL>>(); String sql = "select * from table where conditions order by column"; getJdbcTemplate().query(sql, new RowCallbackHandler() { public void processRow(ResultSet resultSet) throws SQLException { String key = rs.getString("column"); List rows = map.get(key); if (rows == null) { rows = new new ArrayList<MODEL>(); map.put(key, rows); } MODEL obj = new MODEL(); // set values to setters from resultset rows.add(obj); }, "arguments"); return map; }
'열'도 MODEL 클래스의 일부인 경우에만 작동하는 또 다른 솔루션입니다. 그렇게하면 RowMapper를 사용하고 모든 MODEL 객체의 목록을 가져온 다음 나중에 분할 작업을 수행 할 수 있습니다. 구글 구아바를 사용하면 좀 더 쉽게 만들 수 있습니다. 자바 8을 사용한다면 새로운 스트림 API를 사용할 수 있습니다.
-
==============================
2.@geoand가 말했듯이, 최고의 JDBC 코드 또는 JDBCTemplate 사용 여부는 Join을 사용하여 단일 쿼리를 수행하는 것입니다.
@geoand가 말했듯이, 최고의 JDBC 코드 또는 JDBCTemplate 사용 여부는 Join을 사용하여 단일 쿼리를 수행하는 것입니다.
그러나 주석에서 언급했듯이 첫 번째 쿼리의 결과 집합이 항상 작고 (의심스러운), 첫 번째 쿼리에서 검색된 값을 목록에 저장 한 다음 이 목록을 매개 변수로 사용하여 "in"절이있는 두 번째 쿼리 그러면 두 개의 쿼리가 생성됩니다.
어쨌든 첫 번째 쿼리에서 반환 된 각 항목에 대해 별도의 쿼리를 수행하지 않으려합니다. 적은 수의 항목에 대해서도 매우 느릴 수 있습니다. 그러나 필 요하다고 생각되면 첫 번째 쿼리의 결과를 목록에 저장 한 다음 목록의 각 항목에 대해 다른 쿼리를 실행하십시오.
TLDR; 아니요. JDBCTemplate은 원하는 것을 수행하기위한 메커니즘을 제공하지 않습니다. 이는 주로 일반적으로 프로그래밍 방지 패턴의 표준 예제로 간주되기 때문입니다.
from https://stackoverflow.com/questions/25405095/using-a-query-inside-rowmapper by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 세션 생성시 다른 쿠키 추가 [중복] (0) | 2019.05.24 |
---|---|
[SPRING] 원격 클라우드를 사용할 수없는 경우 Spring Cloud Config 서비스에 대한 로컬 대체 설정을 어떻게 설정합니까? (0) | 2019.05.24 |
[SPRING] Grails : 특정 경로에서 Spring Security Core 비활성화 (0) | 2019.05.24 |
[SPRING] CSRF - 처음 로그인 할 때만 (0) | 2019.05.24 |
[SPRING] jOOQ는 소스를 생성하지 않습니다. (0) | 2019.05.24 |