You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将ResultSet转换为List<Object[]>?代码实现咨询

把 ResultSet 转成 List<CSVRaportDescription[]> 的完整实现

看你的代码片段,应该是卡在了把收集到的对象列表转成数组这一步,而且还有几个需要注意的细节,我帮你补全并优化代码:

完整可运行的代码

List<CSVRaportDescription[]> result = new ArrayList<>();
List<CSVRaportDescription> csvRaportDescList = new ArrayList<>();

// 注意:这里直接用replace替换SQL参数有风险,后面会说优化方案
String sql = query.toString().replace("?", dayList.toString());
ResultSet resultSet = dataSource.executeQuery(sql);

// 遍历结果集,收集CSVRaportDescription对象
resultSet.forEach(row -> {
    try {
        // 捕获SQL异常,因为lambda不能抛出检查型异常
        csvRaportDescList.add(new CSVRaportDescription(row.getObject("value")));
    } catch (SQLException e) {
        throw new RuntimeException("读取结果集行失败", e);
    }
});

// 补全你没写完的数组转换代码
CSVRaportDescription[] csvRaportArray = csvRaportDescList.toArray(new CSVRaportDescription[0]);
// 把数组加入最终结果列表
result.add(csvRaportArray);

几个关键优化点

  • 补全数组转换:你之前的toArray(new CSVRaportD...没写完,正确写法是toArray(new CSVRaportDescription[0])(Java 8+推荐这种方式,JVM会自动优化数组大小)
  • SQL参数安全问题:直接用replace("?", dayList.toString())会导致两个问题:一是dayList.toString()会输出带[]的字符串,可能不符合SQL语法;二是存在SQL注入风险。建议用PreparedStatement来安全设置参数,示例如下:
// 假设你的原始SQL是类似"SELECT value FROM table WHERE day IN (?)"
String originalSql = query.toString();
// 根据dayList的大小生成对应数量的占位符
String inClause = String.join(",", Collections.nCopies(dayList.size(), "?"));
String safeSql = originalSql.replace("?", inClause);

// 用PreparedStatement设置参数
try (Connection conn = dataSource.getConnection();
     PreparedStatement stmt = conn.prepareStatement(safeSql)) {
    for (int i = 0; i < dayList.size(); i++) {
        stmt.setObject(i + 1, dayList.get(i));
    }
    ResultSet resultSet = stmt.executeQuery();
    // 后续遍历逻辑同上...
} catch (SQLException e) {
    throw new RuntimeException("执行SQL查询失败", e);
}
  • 异常处理ResultSetgetObject方法会抛出SQLException,而forEach的lambda不能抛出检查型异常,所以需要捕获并包装成运行时异常,避免程序崩溃。

如果你的需求是转成 List<Object[]>(每行对应一个数组)

如果其实你想把结果集的每一行转成Object[]再收集到列表里,代码可以这么写:

List<Object[]> result = new ArrayList<>();
try (Connection conn = dataSource.getConnection();
     PreparedStatement stmt = conn.prepareStatement(safeSql);
     ResultSet resultSet = stmt.executeQuery()) {
    
    ResultSetMetaData metaData = resultSet.getMetaData();
    int columnCount = metaData.getColumnCount();

    resultSet.forEach(row -> {
        try {
            Object[] rowArray = new Object[columnCount];
            for (int i = 1; i <= columnCount; i++) {
                rowArray[i - 1] = row.getObject(i);
            }
            result.add(rowArray);
        } catch (SQLException e) {
            throw new RuntimeException("行转数组失败", e);
        }
    });
} catch (SQLException e) {
    throw new RuntimeException("处理结果集失败", e);
}

内容的提问来源于stack exchange,提问作者Tom

火山引擎 最新活动