2013-04-22 15 views
7

Birden çok sonuç kümesi döndüren Stored Procedures/SQL ile başa çıkmak için kolay bir yol bulmaya çalışıyorum. SimpleJdbcOperations#queryForList() yöntemini kullanıyorum, ancak bu yalnızca ilk sonuç kümesini List<Map<String, Object>> olarak döndürecektir. Birden çok sonuç kümesi alabilmem gerekiyor, ideal olarak CollectionList<Map<String, Object>> veya bir şey. Yazdığım program bir middleware bileşenidir, bu yüzden SQL'in ne olacağını veya sonuç kümesinin ne olduğunu bilmiyorum.JdbcTemplate çoklu sonuç kümeleri

execute(CallableStatementCreator csc, CallableStatementCallback<T> action) dahil olmak üzere daha fazla yönteme erişmemi sağlayan JdbcOperations sınıfını kullanmam gerektiğini düşünüyorum, ancak şimdi takılıyorum.

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

benim jenerik List<Map<String, Object>> s almak için ResultSet ile ilgisi olsa yöntemini ya da ne nasıl kullanılacağını gerçekten emin değilim.

+0

A [ 'ResultSet'] formunda (http://docs.oracle.com/javase/7/docs/api/java içinde ResultSet dair bir liste için bir yöntem aşağıda kullandık /sql/ResultSet.html), SQL'i doğrudan bir veritabanında yürüttükten sonra bulacağınız satırları içerir, hiç bir "Liste >" döndürmez. Getters ile erişebileceğiniz "ResultSet" deki alanlar ile kendiniz oluşturmanız gerekir. –

+0

“hasultSet” i, 'hasNext()' ve 'getObject()' kullanarak yineleyebilmeli miyim? –

+0

“while” döngüsünü 'next()' ile kullanacak ve çeşitli alıcılarla farklı satır alanları elde edeceksiniz. –

cevap

2

Bu kodu kullanarak bir Set<ResultSet> başardı,

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

Sadece ResultSet'u List<Map<String, Object>>'a çevirmeye bakacağım.

+0

Merhaba. Bu sizin için bir alternatif olabilir: http://stackoverflow.com/a/15926687/166589 –

1

Sen verilerde hangi sütunlar çalışmak için resultSet.getMetaData() yöntemini kullanabilirsiniz: Diğer commentors söylediğim gibi

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

Daha sonra yapabileceği yapmak ResultSet bir döngü dışarı çekerek veri ihtiyacınız:

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

Harika teşekkürler :) Sütun sayımı için bir yol arıyordum. –

0

I 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; 
      } 
     }); 
    } 
İlgili konular