2013-04-22 10 views
7

Sto cercando di trovare un modo semplice per gestire stored procedure/SQL restituendo più set di risultati. Sto usando il metodo SimpleJdbcOperations#queryForList() tuttavia questo restituirà solo il primo set di risultati come List<Map<String, Object>>. Devo essere in grado di ottenere più set di risultati, idealmente come Collection di List<Map<String, Object>> o qualcosa del genere. Il programma che sto scrivendo è un componente middleware, quindi non so quale sarà l'SQL o la forma del set di risultati.JdbcTemplate set di risultati multipli

Penso di dover utilizzare la classe JdbcOperations che mi consente di accedere a più metodi, tra cui execute(CallableStatementCreator csc, CallableStatementCallback<T> action) ma ora sono bloccato.

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

io non sono davvero sicuro di come utilizzare il metodo, però, o che cosa fare con il ResultSet per ottenere i miei generici List<Map<String, Object>> s.

+0

A [ 'ResultSet'] (http://docs.oracle.com/javase/7/docs/api/java /sql/ResultSet.html) contiene le righe come le avreste trovate dopo aver eseguito SQL direttamente su un database, non restituirà mai un 'Elenco >'. Devi generarlo tu stesso con i campi nel 'ResultSet', a cui puoi accedere con getter. –

+0

Dovrei essere in grado di iterare il 'ResultSet' usando' hasNext() 'e' getObject() '? –

+0

Si usa un ciclo 'while' con' next() 'e si ottengono campi di riga diversi con i vari getter. –

risposta

2

sono riuscito ad ottenere un Set<ResultSet> usi questo codice,

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

Basta dare un'occhiata alla traduzione di ResultSet in List<Map<String, Object>>.

+0

Ciao. Questa potrebbe essere un'alternativa per te: http://stackoverflow.com/a/15926687/166589 –

1

È possibile utilizzare il metodo resultSet.getMetaData() per capire cosa sono le colonne nei dati:

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... 
} 

si può poi fare come gli altri commentors hanno detto che fare un ciclo attraverso il ResultSet tirando fuori il dati che vi servono:

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

Oh bello grazie :) Stavo cercando un modo per ottenere il conteggio delle colonne. –

0

ho usato sotto metodo per ottenere Elenco dei ResultSet in forma di 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; 
      } 
     }); 
    }