2013-05-08 358 views
1

假设我有多个ResultSet(每个resultSet将引用数据库中的1行)(它们具有相同的表)。现在我想创建实习生拥有其他所有resultSet的统一结果集。所以我的主要目标是创建一个组合的ResultSet,它将指向先前由各个resultSet指向的所有行。将多个ResultSet合并到Java中的单个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 

回答

3

如果您正在谈论一个java.sql.ResultSet,根据我所知,这是不可能的W上。我建议你改变你的查询。

或者您可以将结果检索到java对象,然后将所有对象合并到一个Collection中。

1

如果结果会来自同一张表,为什么不在您的查询中使用UNION/UNION ALL(取决于您的需求)。

事情是这样的:

select A, B 
from C where Q = R 
union 
select A, B 
from C where P = S 

否则,不存在通过每个结果集和填充的POJO并将它们添加到List/Set(你的需求基于)迭代的艰辛的道路。如果有很多结果集,这似乎是一个矫枉过正的问题。

0

我会做这样

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

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

     } 
    }