2013-04-22 61 views
7

我想找到一个简单的方法来处理存储过程/ SQL返回多个结果集。我一直在使用SimpleJdbcOperations#queryForList()方法,但是这只会返回第一个结果集为List<Map<String, Object>>。我需要能够获得多个结果集,理想的情况是CollectionList<Map<String, Object>>或其他。我正在编写的程序是一个中间件组件,所以我不知道SQL会是什么,或者结果集的形式。JdbcTemplate多个结果集

我认为我必须使用JdbcOperations类,它使我可以访问更多的方法,包括execute(CallableStatementCreator csc, CallableStatementCallback<T> action),但现在我卡住了。

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

我真的不知道如何使用虽然方法,或者是与ResultSet做的就是我的通用List<Map<String, Object>>秒。

+0

A ['ResultSet']的形式(http://docs.oracle.com/javase/7/docs/api/java /sql/ResultSet.html)包含直接在数据库上执行SQL后发现它们的行,它不会返回'List >'。您必须使用ResultSet中的字段自行生成,您可以使用getter访问该字段。 – 2013-04-22 14:34:14

+0

我应该能够使用'hasNext()'和'getObject()'迭代ResultSet'? – 2013-04-22 14:42:39

+0

你可以使用'while'循环与'next()'并且获得不同的行字段与不同的getter。 – 2013-04-22 14:44:35

回答

2

我设法使用此代码来获得一个Set<ResultSet>

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

只要看翻译ResultSetList<Map<String, Object>>

+0

嗨。这可能是您的替代选择:http://stackoverflow.com/a/15926687/166589 – 2015-09-03 11:31:23

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

哦,很酷谢谢:)我正在寻找一种方法来获得列数。 – 2013-04-22 15:03:24

0

我已经使用以下方法来获得结果集的列表中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; 
      } 
     }); 
    }