복붙노트

[SPRING] RowMapper에서 쿼리 사용하기

SPRING

RowMapper에서 쿼리 사용하기

자바에서 나는 결과 집합을 반복하고 쿼리를 형성하기 위해 아래와 같이 할 것이다.

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.여러 사람이 말했듯이 솔루션이 효율적이지는 않지만 기본적으로 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. ==============================

    2.@geoand가 말했듯이, 최고의 JDBC 코드 또는 JDBCTemplate 사용 여부는 Join을 사용하여 단일 쿼리를 수행하는 것입니다.

    @geoand가 말했듯이, 최고의 JDBC 코드 또는 JDBCTemplate 사용 여부는 Join을 사용하여 단일 쿼리를 수행하는 것입니다.

    그러나 주석에서 언급했듯이 첫 번째 쿼리의 결과 집합이 항상 작고 (의심스러운), 첫 번째 쿼리에서 검색된 값을 목록에 저장 한 다음 이 목록을 매개 변수로 사용하여 "in"절이있는 두 번째 쿼리 그러면 두 개의 쿼리가 생성됩니다.

    어쨌든 첫 번째 쿼리에서 반환 된 각 항목에 대해 별도의 쿼리를 수행하지 않으려합니다. 적은 수의 항목에 대해서도 매우 느릴 수 있습니다. 그러나 필 요하다고 생각되면 첫 번째 쿼리의 결과를 목록에 저장 한 다음 목록의 각 항목에 대해 다른 쿼리를 실행하십시오.

    TLDR; 아니요. JDBCTemplate은 원하는 것을 수행하기위한 메커니즘을 제공하지 않습니다. 이는 주로 일반적으로 프로그래밍 방지 패턴의 표준 예제로 간주되기 때문입니다.

  3. from https://stackoverflow.com/questions/25405095/using-a-query-inside-rowmapper by cc-by-sa and MIT license