假设我有多个ResultSet(每个resultSet都会引用数据库中的1行)(它们是同一个表。)。现在我想创建合并的ResultSet,实习生将拥有所有其他resultSet。所以我的主要目标是创建一个组合的ResultSet,它将指向以前由各个resultSet指向的所有行。
我正在使用Java。有人知道我们能够实现这一目标吗?
修改:我们正在使用java.sql.ResultSet
。
编辑:为了更清楚:
我说我有
List<ResultSet> someResults ; // each resultSet Would point to a single row in database.
我想创建一个合并的ResultSet finalResults;
psudo代码:
List<ResultSet> resultSets = // poppulated from code
ResultSet rs = convert(resultSets) // psude conver method
答案 0 :(得分:3)
如果你在谈论java.sql.ResultSet,据我所知,这是不可能的。我建议你改变你的查询。
或者您可以将结果检索到java对象中,然后将所有对象组合到Collection中。
答案 1 :(得分:1)
如果结果来自同一个表格,为什么不在查询本身中使用UNION/UNION ALL
(取决于您的需要)。
这样的事情:
select A, B
from C where Q = R
union
select A, B
from C where P = S
否则,有很难迭代每个结果集并填充POJO并将它们添加到List/Set
(根据您的需要)。如果有很多结果集,这似乎是一种矫枉过正。
答案 2 :(得分:1)
我会这样做
class GatheringResultSet implements ResultSet {
List<E> resultSets;
ResultSet current;
GatheringResultSet(List resultSets) {
this.resultSets = new ArrayList(resultSets);
current = resultSets.remove(0);
}
@Override
public boolean next() throws SQLException {
if (current.next()) {
return true;
}
if (resultSets.isEmpty()) {
return false;
}
current = resultSets.remove(0);
return true;
}
...
其余方法只是委托调用当前的ResultSet
答案 3 :(得分:0)
public class ResultSets {
private java.util.List<java.sql.ResultSet> resultSets;
private java.sql.ResultSet current;
@lombok.SneakyThrows
public ResultSets(java.util.List<java.sql.ResultSet> resultSets) {
this.resultSets = new java.util.ArrayList<>(resultSets);
current = resultSets.remove(0);
}
@lombok.SneakyThrows
public boolean next() {
if (current.next()) {
return true;
}else if (!resultSets.isEmpty()) {
current = resultSets.remove(0);
return next();
}
return false;
}
@lombok.SneakyThrows
public int getInt(int pos){
return current.getInt(pos);
}
@lombok.SneakyThrows
public String getString(String field){
return current.getString(field);
}
}
用法: -
@lombok.SneakyThrows
public static void main(String ... args) {
Connection conn = pe.getConnection("backup");
String sql1 = "SELECT count(distinct(User_Key)) FROM user_table";
String sql2 = "SELECT count(distinct(Username)) FROM user_table";
Statement stmt1 = conn.createStatement();
Statement stmt2 = conn.createStatement();
List<ResultSet> resultSets = new ArrayList<>();
resultSets.add(stmt1.executeQuery(sql1));
resultSets.add(stmt2.executeQuery(sql2));
ResultSets rs = new ResultSets(resultSets);
while(rs.next()){
System.out.println(rs.getInt(1));
}
}