You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JdbcTemplate操作Postgres时RowCallbackHandler返回空ResultSet,ResultSetExtractor非空

问题原因与解决方案

核心错误:RowCallbackHandler 使用方式完全错误

你在PostgreSQL的RowCallbackHandler实现里多写了while(rs.next())循环,这是问题的根源:

  • RowCallbackHandler的processRow方法是Spring自动遍历ResultSet每一行时,逐行调用一次,每次调用时rs已经指向当前待处理的行,不需要再调用rs.next()
  • 额外添加的while(rs.next())会强制指针跳过当前行:如果结果集只有一行,第一次调用时指针会直接跳到结果集末尾,自然读不到数据;如果有多行,也会导致跳过半数行或出现异常

而ResultSetExtractor是让你自行处理完整的结果集,所以写while(rs.next())是正确的,这也是它能正常输出的原因。

修正后的代码

移除PostgreSQL的RowCallbackHandler中的while(rs.next())循环,直接读取当前行即可:

dstTemplate.query("select plant from plant", new RowCallbackHandler()
{
    @Override
    public void processRow(ResultSet rs) throws SQLException
    {
        System.out.println("destination plant: " + rs.getString(1));
    }
});

另外,你SQL Server的Lambda写法虽然看似正常,但其实也不符合RowCallbackHandler的设计逻辑,正确的Lambda写法应该去掉循环:

srcTemplate.query("select plant from plant", rs -> {
    System.out.println("source plant: " + rs.getString(1));
});

补充说明

  • RowCallbackHandler的设计目的就是简化逐行处理逻辑,Spring框架会自动完成结果集的遍历工作
  • ResultSetExtractor则是提供完全的控制权,需要开发者自行实现结果集的遍历逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:38:16