在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.