2013-04-22 21 views
7

Próbuję znaleźć prosty sposób na radzenie sobie ze Stored Procedures/SQL zwracających wiele zestawów wyników. Używałem metody SimpleJdbcOperations#queryForList(), jednak zwróci to tylko pierwszy zestaw wyników jako List<Map<String, Object>>. Muszę być w stanie uzyskać wiele zestawów wyników, najlepiej jako Collection z List<Map<String, Object>> lub coś podobnego. Program, który piszę, to komponent oprogramowania pośredniego, więc nie wiem, jaki będzie kod SQL lub forma zestawu wyników.JdbcTemplate wiele zestawów wyników

Myślę, że muszę używać klasy JdbcOperations, która daje mi dostęp do większej liczby metod, w tym execute(CallableStatementCreator csc, CallableStatementCallback<T> action), ale teraz utknąłem.

CallableStatementCallback<T> callback = new CallableStatementCallback<T>() { 
     @Override 
     public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException 
     { 
      boolean results = cs.execute(request); 
      while(results) 
      { 
       ResultSet result = cs.getResultSet(); 
       results = cs.getMoreResults(); 
      } 
      return null; 
     } 
}; 

nie jestem pewien, jak użyć metody jednak, czy co zrobić z ResultSet aby moje ogólne List<Map<String, Object>> s.

+0

A [ '] (http://docs.oracle.com/javase/7/docs/api/java ResultSet' /sql/ResultSet.html) zawiera wiersze, które można znaleźć po wykonaniu SQL bezpośrednio w bazie danych, nigdy nie zwróci listy "List >". Musisz go wygenerować samodzielnie za pomocą pól w 'ResultSet', do którego możesz uzyskać dostęp za pomocą modułów pobierających. –

+0

Powinienem móc iterować 'ResultSet' przy użyciu' hasNext() 'i' getObject() '? –

+0

Powinieneś użyć pętli 'while' z' next() 'i uzyskać różne pola wierszy z różnymi procesami pobierającymi. –

Odpowiedz

2

udało mi się dostać Set<ResultSet> używając tego kodu,

private Set<ResultSet> executeProcedure(final String sql) 
{ 
    return jdbc.execute(new CallableStatementCreator() { 
     @Override 
     public CallableStatement createCallableStatement(Connection con) throws SQLException 
     { 
      return con.prepareCall(sql); 
     } 
    }, new CallableStatementCallback<Set<ResultSet>>() { 
     @Override 
     public Set<ResultSet> doInCallableStatement(CallableStatement cs) throws SQLException 
     { 
      Set<ResultSet> results = new HashSet<>(); 

      boolean resultsAvailable = cs.execute(); 

      while (resultsAvailable) 
      { 
       results.add(cs.getResultSet()); 
       resultsAvailable = cs.getMoreResults(); 
      } 
      return results; 
     } 
    }); 
} 

Wystarczy spojrzeć na tłumaczenie ResultSet na List<Map<String, Object>>.

+0

Witam. To może być dla ciebie alternatywa: http://stackoverflow.com/a/15926687/166589 –

1

Można użyć metody resultSet.getMetaData(), aby się zorientować, co kolumny są w danych:

ResultSetMetaData meta = resultSet.getMetaData(); 
int colcount = meta.getColumnCount(); 
for (int i = 1; i <= colcount; i++) 
{ 
    String name = meta.getColumnLabel(i); // This is the name of the column 
    int type = meta.getColumnType(i);  // from java.sql.Types 
    // Maybe add to a Map,List, etc... 
} 

Następnie można zrobić jak inni commentors wspomniałem zrobić pętlę poprzez ResultSet wyciągnij moduł dane potrzebne:

while (resultSet.hasNext()) 
{ 
    resultSet.next(); 
    // Find the columns you want to extract (via the above method maybe) and add to your row. 
} 
+0

Och, fajne dzięki :) Szukałem sposobu na uzyskanie liczby kolumn. –

0

Użyłem poniżej metody dostać Lista ResultSet w postaci List<Map<String, Object>>

public List<List<Map<String, Object>>> executeProcedure(final String sql) { 
     return jdbcTemplate.execute(new CallableStatementCreator() { 
      @Override 
      public CallableStatement createCallableStatement(Connection con) throws SQLException { 
       return con.prepareCall(sql); 
      } 
     }, new CallableStatementCallback<List<List<Map<String, Object>>>>() { 
      @Override 
      public List<List<Map<String, Object>>> doInCallableStatement(CallableStatement cs) throws SQLException { 
       boolean resultsAvailable = cs.execute(); 
       List<List<Map<String, Object>>> list = new ArrayList<List<Map<String, Object>>>(); 
       while (resultsAvailable) { 
        ResultSet resultSet = cs.getResultSet(); 
        List<Map<String, Object>> subList = new ArrayList<Map<String, Object>>(); 
        while (resultSet.next()) { 
         ResultSetMetaData meta = resultSet.getMetaData(); 
         int colcount = meta.getColumnCount(); 
         Map<String, Object> map = new HashMap<String, Object>(); 
         for (int i = 1; i <= colcount; i++) { 
          String name = meta.getColumnLabel(i); 
          map.put(name, resultSet.getString(i)); 
         } 
         subList.add(map); 
        } 
        list.add(subList); 
        resultsAvailable = cs.getMoreResults(); 
       } 
       return list; 
      } 
     }); 
    } 
Powiązane problemy