java-在RowMapper中使用查询

Java中,我会执行以下操作来迭代结果集并形成查询,

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;
            }

我之所以使用单独的查询的原因是,我要将不同的值添加到map键,并将它们的对应值(如List)添加到map的值.注意(其结果是column1的值重复),但是我需要将它们存储为地图关键字,并因此使其具有唯一性.
我也需要其所有关联的值,所以填充列表

我如何使用JdbcTemplate实现相同的功能,

提前致谢

解决方法:

正如多人所言,您的解决方案虽然可能有效,但效率并不高,您基本上陷入了1+N select problem的陷阱.1个查询以检索某个ID,然后为每个ID检索另一个查询(因此选择1 N个查询).

最好只编写一个查询即可一次性检索所有内容.查看您的代码,您有以下两个查询,根据它们的外观,它们在同一张表上进行操作.

String sql1 = "select distinct(column) from table where conditions orderby column ";
String sql2 = "select * from table where column="+s

现在您可以使第一个查询成为第二个查询的子选择

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为您完成),以便您为关键列检查Map(如果列表已经存在).如果是,则添加一行(如果不是),则首先创建List并将其添加到结果Map中.

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对象的列表,然后进行分区.您可以使用Google Guava使其更容易些,或者如果您使用Java 8,则可以使用新的stream api.

上一篇:JdbcTemplate RowMapper接口


下一篇:java.sql.SQLException:使用jdbcTemplate的无效列索引