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
相关产品推荐
相关产品推荐

