如何从java.sql.ResultSet中获取所有剩余行?附Datastax实现参考
用java.sql.ResultSet实现Datastax ResultSet的all()转模型数组功能
首先,标准JDBC的java.sql.ResultSet和Datastax Cassandra驱动的ResultSet逻辑不一样——它是基于游标逐行读取的,没有现成的all()方法一次性获取所有行。不过我们可以手动遍历游标,把每一行转成ReportDescription对象,最后再转成数组,实现和原来完全一样的效果。
下面是对应的完整实现代码:
List<ReportDescription[]> result = new ArrayList<>(); List<ReportDescription> tempList = new ArrayList<>(); try { // 遍历JDBC ResultSet的所有剩余行 while (resultSet.next()) { // 取出"value"字段,实例化ReportDescription对象 ReportDescription report = new ReportDescription(resultSet.getObject("value")); tempList.add(report); } // 将临时List转成ReportDescription数组 ReportDescription[] csvReportDescriptions = tempList.toArray(new ReportDescription[0]); result.add(csvReportDescriptions); } catch (SQLException e) { // 务必处理JDBC操作可能抛出的SQLException e.printStackTrace(); // 也可以根据业务需求抛出自定义异常或做其他容错处理 }
关键细节说明:
- 为什么先用
List<ReportDescription>临时存储?因为JDBC的ResultSet无法提前精准获取剩余行数(虽然可以通过ResultSetMetaData尝试,但不同数据库支持度不一,效率也不高),用List动态收集行数据是最稳妥的方式。 tempList.toArray(new ReportDescription[0])是Java中List转数组的常用写法,JDK会自动根据List的实际大小创建对应长度的数组。- 不能忽略
SQLException:JDBC的next()、getObject()等操作都会抛出这个检查型异常,必须显式处理。
对比你原来的Datastax代码,核心逻辑是完全一致的——都是把每一行映射为目标对象,最后转成数组加入结果列表,只是JDBC需要我们手动完成游标遍历的步骤而已。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

