2013-05-08 356 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)); 

     } 
    }