使用Snowflake JDBC驱动时,NamedParameterJdbcTemplate返回结果少一行
解决Snowflake JDBC驱动与NamedParameterJdbcTemplate缺失第一行数据的问题
问题根源
旧版本Snowflake JDBC驱动(如3.22.0)与Spring NamedParameterJdbcTemplate存在兼容性bug,参数绑定阶段的内部逻辑会导致ResultSet游标被提前移动一次,进而跳过第一行数据。
解决方案
升级Snowflake JDBC驱动
将依赖版本从net.snowflake:snowflake-jdbc:3.22.0升级到最新稳定版(如3.14.30)。官方后续版本修复了多个与Spring框架的兼容性问题,可直接解决该异常。改用Spring RowMapper处理结果集
放弃手动遍历ResultSet,使用Spring提供的RowMapper接口让框架内部处理结果集遍历,规避游标异常:String sql = "SELECT col1, col2 FROM your_table WHERE id = :id"; Map<String, Object> params = Collections.singletonMap("id", 123); List<YourEntity> result = namedParameterJdbcTemplate.query(sql, params, (rs, rowNum) -> { YourEntity entity = new YourEntity(); entity.setCol1(rs.getString("col1")); entity.setCol2(rs.getInt("col2")); return entity; });临时规避方案(无法升级驱动时)
在手动遍历前调用rs.beforeFirst()重置游标到结果集起始位置,再执行循环:namedParameterJdbcTemplate.query(sql, params, rs -> { rs.beforeFirst(); // 确保游标回到起始点 while (rs.next()) { // 处理每行数据逻辑 } return null; });注:需验证Snowflake JDBC驱动是否支持
beforeFirst()操作,该方法在绝大多数场景下可用。
内容的提问来源于stack exchange,提问作者fromthebasement
相关产品推荐
相关产品推荐

