簡體   English   中英

在Java中將多個ResultSet合並為單個ResultSet

[英]Merging Multiple ResultSet into Single ResultSet in Java

假設我有多個ResultSet(每個resultSet將引用數據庫中的1行)(它們屬於同一表。)。 現在,我想創建合並的ResultSet,該ResultSet將具有所有其他resultSet。 因此,我的主要目標是創建一個組合的ResultSet,該ResultSet指向以前由單個resultSet指向的所有行。

我正在使用Java。 有誰知道我們能務實地做到這一點嗎?

編輯:我們正在使用java.sql.ResultSet

編輯:使其更清楚:

假設我有

List<ResultSet> someResults ; // each resultSet Would point to a single row in database.

我想創建一個合並的ResultSet finalResults;

偽代碼:

List<ResultSet> resultSets = // poppulated from code
ResultSet rs  = convert(resultSets) // psude conver method

如果您正在談論java.sql.ResultSet,就我所知這是不可能的。 我建議您改為更改查詢。

或者,您可以將結果檢索到java對象中,然后將所有對象組合成一個Collection。

如果結果將來自同一表,為什么不在查詢本身中使用UNION/UNION ALL (取決於您的需求)。

像這樣:

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

否則,很難通過每個結果集進行迭代並填充POJO並將它們添加到List/Set (根據您的需要)。 如果有很多結果集,這似乎是一個過大的殺傷力。

我會這樣

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

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

        }
  } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM