2013-04-22 12 views
7

Ich versuche, eine einfache Möglichkeit zu finden, mit Stored Procedures/SQL umzugehen, die mehrere Ergebnismengen zurückgibt. Ich habe die SimpleJdbcOperations#queryForList() Methode verwendet, aber dies wird nur das erste Ergebnis als List<Map<String, Object>> zurückgeben. Ich muss in der Lage sein, mehrere Ergebnissätze zu erhalten, idealerweise als Collection von List<Map<String, Object>> oder etwas. Das Programm, das ich schreibe, ist eine Middleware-Komponente, daher weiß ich nicht, was das SQL sein wird oder die Form der Ergebnismenge.JdbcTemplate mehrere Ergebnissätze

Ich denke, ich muss die JdbcOperations Klasse verwenden, die mir Zugang zu mehr Methoden gibt, einschließlich execute(CallableStatementCreator csc, CallableStatementCallback<T> action), aber jetzt bin ich fest.

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

Ich bin nicht wirklich sicher, wie die Methode zu verwenden, obwohl, oder was mit den ResultSet zu tun, um meinen generischen List<Map<String, Object>> s zu erhalten.

+0

A [ 'ResultSet'] (http://docs.oracle.com/javase/7/docs/api/java verwendet /sql/ResultSet.html) enthält Zeilen, wie Sie sie nach dem Ausführen von SQL direkt in einer Datenbank finden würden, es wird niemals eine 'List >' zurückgeben. Sie müssen es selbst mit den Feldern im 'ResultSet' erzeugen, auf die Sie mit Gettern zugreifen können. –

+0

Ich sollte in der Lage sein, das 'ResultSet' mit' hasNext() 'und' getObject() 'zu iterieren? –

+0

Sie würden eine 'while' Schleife mit' next() 'verwenden und verschiedene Zeilenfelder mit den verschiedenen Gettern erhalten. –

Antwort

2

ich es geschafft, eine Set<ResultSet> mit diesem Code zu bekommen,

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

Betrachten wir einfach die ResultSet in List<Map<String, Object>> übersetzen.

+0

Hallo. Dies könnte eine Alternative für Sie sein: http://StackOverflow.com/a/15926687/166589 –

1

Sie können die resultSet.getMetaData() -Methode verwenden, um herauszufinden, welche Spalten in den Daten sind:

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

Anschließend können Sie tun, wie die anderen commentors erwähnt habe eine Schleife durch das ResultSet Herausziehen der Daten, die Sie brauchen:

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

Oh cool danke :) Ich war auf der Suche nach einer Möglichkeit, die Anzahl der Spalten zu bekommen. –

0

Ich habe unten Methode, um Liste der ResultSet in Form von 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; 
      } 
     }); 
    }