2013-04-22 18 views
7

複数の結果セットを返すストアドプロシージャ/ SQLを扱う簡単な方法を見つけることを試みています。私はSimpleJdbcOperations#queryForList()メソッドを使用していますが、これは最初の結果セットをList<Map<String, Object>>として返します。私はList<Map<String, Object>>または何かのCollectionとして理想的には、複数の結果セットを得ることができる必要があります。私が書いているプログラムはミドルウェアのコンポーネントなので、SQLの内容や結果セットの形式がわかりません。JdbcTemplate複数の結果セット

私はexecute(CallableStatementCreator csc, CallableStatementCallback<T> action)を含むより多くのメソッドにアクセスできるように、JdbcOperationsクラスを使用する必要があると思うが、今は詰まっている。

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

でも、私はこの方法を使用するか、どのような私のジェネリックList<Map<String, Object>> Sを取得するためにResultSetをどうするか、本当にわかりません。

+0

A [ 'ResultSet']の形(http://docs.oracle.com/javase/7/docs/api/javaでのResultSetのリストを取得する方法の下に使用しています/sql/ResultSet.html)には、データベース上でSQLを直接実行した後に見つかるような行が含まれていますが、 'List >'は返されません。 getterでアクセスできる 'ResultSet'のフィールドを使って自分で生成する必要があります。 –

+0

'hasNext()'と 'getObject()'を使って 'ResultSet'を繰り返し処理できるはずですか? –

+0

'next()'で 'while'ループを使い、さまざまなgetterで異なる行フィールドを取得します。 –

答えて

2

私は

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; 
     } 
    }); 
} 
、このコードを使用して Set<ResultSet>を得ることができました

ResultSetList<Map<String, Object>>に翻訳するだけです。

+0

こんにちは。これはあなたの代わりになるかもしれません:http://stackoverflow.com/a/15926687/166589 –

1

あなたがデータであるかの列動作するようにresultSet.getMetaData()メソッドを使用することができます:他のコメント主が言及したように

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

は、あなたがそれから行うことができます行うのResultSetをループで引き出しますあなたが必要とするデータ:

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

ああクール感謝:)私は列カウントを取得する方法を探していた。 –

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; 
      } 
     }); 
    } 
関連する問題