H2数据库是否仅支持单个ResultSet?单次查询能否返回多结果集?
H2数据库单次执行多语句无法返回多个结果集的问题
问题场景
尝试通过单次查询获取两个结果集,但仅能得到第一个表的数据,对应的Java代码如下:
try { Connection connection = DriverManager.getConnection(h2_conn); Statement statement = connection.createStatement(); // Execute a SQL query that returns multiple result sets String sql = "select * from `test1234` limit 1;" + "select * from `test1234` limit 2;"; boolean hasMoreResults = statement.execute(sql); // Process each result set int resultSetNumber = 1; do { ResultSet resultSet = statement.getResultSet(); while (resultSet.next()) { // Process the current result set System.out.println("Result Set " + resultSetNumber); System.out.println(resultSet.getString(1)); System.out.println(resultSet.getString(2)); } resultSetNumber++; hasMoreResults = statement.getMoreResults(); } while (hasMoreResults); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); }
原因说明
根据H2官方文档描述:
移动到下一个结果集——但始终只有一个结果集。此调用还会关闭当前结果集(如果存在)。如果有下一个结果集则返回true(这意味着它始终返回false)。
这明确说明H2数据库的JDBC Statement默认不支持单次执行多语句返回多个结果集,即便在SQL中编写多个查询语句,它只会处理第一个,后续语句不会被执行,因此无法获取多个结果集。
替代解决方案
如果需要获取多个表的结果,可选择以下两种方式:
- 拆分SQL语句,分别执行每个查询,依次获取对应的结果集;
- 使用
UNION ALL合并两个查询(需保证两个查询的列数、列类型匹配),示例SQL:
这种方式会将两个结果合并为一个结果集返回,若需区分原数据来源,需在代码中自行处理。select * from `test1234` limit 1 union all select * from `test1234` limit 2;
内容的提问来源于stack exchange,提问作者Dung Nguyen
相关产品推荐
相关产品推荐

