2023 年 9 月 6 日—1
2023 年 9 月 6 日—1
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
报错内容
1 | org.springframework.dao.TransientDataAccessResourceException: StatementCallback; SQL [SELECT concat_ws(',',id, time, imgname, hex(imgdata), img, results, state, pjwd, orgcode, orgname, tickettype, jsonid, flag, inputtime, analysis, project_id, countfx, type, ticketname) FROM t_json_data where orgCode='O06000000000130' and project_id='PC1692689126000' LIMIT 1500 OFFSET 0]; Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.; nested exception is java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY. |
原因分析
根据您提供的异常信息,您遇到了一个 org.springframework.dao.TransientDataAccessResourceException
异常。这个异常是由于在执行 SQL 查询时出现了问题。
具体来说,异常信息中提到了一个 Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY
错误。这个错误通常是由于使用了 ResultSet.TYPE_FORWARD_ONLY
类型的结果集,而该类型的结果集只能向前遍历,不支持随机访问。
要解决这个问题,您可以尝试以下几种方法:
- 使用
ResultSet.TYPE_SCROLL_INSENSITIVE
或ResultSet.TYPE_SCROLL_SENSITIVE
类型的结果集,这些类型的结果集支持随机访问。您可以在执行查询时指定结果集的类型,例如:
1 | Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); |
- 如果您只需要向前遍历结果集,可以尝试在执行查询时添加
ResultSet.CONCUR_READ_ONLY
参数,例如:
1 | Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); |
- 如果您使用的是 Spring 的 JdbcTemplate,可以尝试使用
query
方法的重载版本,指定结果集的类型,例如:
1 | List<MyObject> results = jdbcTemplate.query("SELECT ...", new Object[]{}, new BeanPropertyRowMapper<>(MyObject.class), ResultSet.TYPE_SCROLL_INSENSITIVE); |
请注意,具体的解决方法可能因您的代码和环境而异。如果以上方法都无法解决问题,建议您检查您的代码逻辑,确保在处理结果集时没有出现其他问题。
希望这些信息对您有所帮助!如果您有任何其他问题,请随时提问。
解决方案
1 | jdbcTemplate.query("SELECT * FROM your_table", new ResultSetExtractor<Void>() { |