2

假设我有多个 ResultSet(每个 resultSet 将引用数据库中的 1 行)(它们属于同一张表。)。现在我想创建合并的结果集,它将实习生拥有所有其他结果集。所以我的主要目标是创建一个组合的 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
4

4 回答 4

3

如果您在谈论 java.sql.ResultSet,据我所知这是不可能的。我建议您更改您的查询。

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

于 2013-05-08T09:17:31.900 回答
2

我会这样做

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

于 2013-05-08T09:39:48.347 回答
1

如果结果将来自同一个表,为什么不在UNION/UNION ALL查询本身中使用(取决于您的需要)。

像这样的东西:

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

否则,遍历每个结果集并填充 POJO 并将它们添加到List/Set(根据您的需要)是一种艰难的方式。如果有很多结果集,这似乎有点过头了。

于 2013-05-08T09:19:19.937 回答
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));

        }
  } 
于 2014-06-11T09:19:51.840 回答