2013-05-08 3 views
1

Скажем, у меня есть несколько ResultSet (каждый набор результатов будет ссылаться на 1 строку в базе данных) (они из одной таблицы.). Теперь я хочу создать консолидированный ResultSet, который будет иметь все остальные результирующие элементы. Поэтому моя основная цель - создать объединенный ResultSet, который будет указывать на все строки, которые ранее указывали на отдельный набор результатов.Объединение нескольких ResultSet в единый ResultSet в Java

Я использую Java. Кто-нибудь знает, насколько прагматично мы можем это достичь?

Редактировать: мы используем java.sql.ResultSet.

Edit: Для того, чтобы сделать его более ясным:

Пусть говорят, что я

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, это невозможно, насколько я знаю ш. Я предлагаю вам вместо этого изменить свой запрос.

Или вы можете получить результаты в объект java, а затем объединить все объекты в коллекцию.

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

     } 
    } 
Смежные вопросы