似乎ResultSet
清空的标准检查在Spring的JDBC ResultSetExtractor
中不起作用。我按照以下方式使用它:
return jdbcTemplate.query(sql, ps -> {
ps.setLong(1, fooParam1);
ps.setLong(2, fooParam2);
}, rs -> {
return rs.getLong(1);
});
那么在这种模式中检查ResultSet
空虚的正确方法是什么?
答案 0 :(得分:5)
关于接口的角色似乎有些混乱,我看到一些教程做错了。接口RowMapper
和RowCallbackHandler
负责提供值,分别为。每排产生副作用。
因此,他们不负责调用next()
,因为一旦next()
返回false
,框架将继续前进到下一行并且不会调用回调ResultSet
当前进到第一行时,List
为空。在后一种情况下,query(… RowMapper<T>)
将返回空RowMapper
而不调用ResultSet
,query(… RowCallbackHandler)
将无效。
相反,ResultSetExtractor
负责处理整个 next()
,其中包括适当地调用extractData
。所以你的问题是前提(“...... ResultSet
的每次调用给了我新的一行。”)是错误的。所有JDBC操作的标准行为是在第一行之前返回next()
,以便第一个false
调用将当前行指针移动到第一行或返回ResultSet
return jdbcTemplate.query(sql, ps -> {
ps.setLong(1, fooParam1);
ps.setLong(2, fooParam2);
}, rs -> rs.next()? rs.getLong(1): null);
为空。因此,如果您最多想要一行,那么您的查询应该看起来像
MySQL
编辑:此解决方案经过测试,可在标准Postgresql
和JdbcTemplate
实例/ Andremoniy /上正常运行。
EDIT-2:此解决方案绝对正确且可在任何地方正常运行。但应该注意 public <T> T query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse)
类中有两种不同的方法:
0
- 在此示例中使用它,确实总是为rs.getRows()
返回public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)
。提供的解决方案对于这种情况是正确的。
jdbcTemplate.query(sql, ps -> {
ps.setLong(1, fooParam1);
ps.setLong(2, fooParam2);
}, rs -> {
System.out.println(rs.getRow());
});
,它有另一种类型的第三个参数,类似代码:
rs.getRow()
将以不同的方式工作:processRow
将返回处理行的数量,如果不存在行,则永远不会调用{{1}}方法(第二种方法导致我的混淆)。 / Andremoniy /