gpt4 book ai didi

java - 在 RowMapper 中使用查询

转载 作者:行者123 更新时间:2023-11-29 05:19:23 28 4
gpt4 key购买 nike

在 java 中,我会做类似下面的事情来迭代 resultset 并形成查询,

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+N select problem 的陷阱。 . 1 个查询检索一些 id,接下来为每个 id 另一个查询(因此 1+N 选择)。

最好只编写一个一次性检索所有内容的查询。查看您的代码,您有以下 2 个查询,从外观上看,它们在同一个表上运行。

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

您现在可能会为您的键(在 Map 中)获取多个值。您可以做两件事,要么自己使用 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 对象的 List 并在之后进行分区。您可以使用 Google Guava 来简化此操作,或者如果您使用的是 Java 8,则可以为此使用新的流 API。

关于java - 在 RowMapper 中使用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25405095/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com