JdbcTemplate多个结果集

我试图找到一种简单的方法来处理Stored Procedures / SQL返回多个结果集。 我一直在使用SimpleJdbcOperations#queryForList()方法,但是这只会将第一个结果集作为List<Map> 。 我需要能够获得多个结果集,理想情况下是List<Map>Collection 。 我写的程序是一个中间件组件,所以我不知道SQL将是什么,或结果集的forms。

我想我必须使用JdbcOperations类,它允许我访问更多方法,包括execute(CallableStatementCreator csc, CallableStatementCallback action)但现在我被卡住了。

  CallableStatementCallback callback = new CallableStatementCallback() { @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>

我设法使用此代码获取Set

 private Set executeProcedure(final String sql) { return jdbc.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { return con.prepareCall(sql); } }, new CallableStatementCallback>() { @Override public Set doInCallableStatement(CallableStatement cs) throws SQLException { Set results = new HashSet<>(); boolean resultsAvailable = cs.execute(); while (resultsAvailable) { results.add(cs.getResultSet()); resultsAvailable = cs.getMoreResults(); } return results; } }); } 

只是看看将ResultSet转换为List>

您可以使用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. } 

我使用下面的方法以List>forms获取ResultSet的List>

 public List>> executeProcedure(final String sql) { return jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { return con.prepareCall(sql); } }, new CallableStatementCallback>>>() { @Override public List>> doInCallableStatement(CallableStatement cs) throws SQLException { boolean resultsAvailable = cs.execute(); List>> list = new ArrayList>>(); while (resultsAvailable) { ResultSet resultSet = cs.getResultSet(); List> subList = new ArrayList>(); while (resultSet.next()) { ResultSetMetaData meta = resultSet.getMetaData(); int colcount = meta.getColumnCount(); Map map = new HashMap(); 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; } }); }