Для тех, кто использует Spring JDBC и видит это поведение, обратите внимание, что код ResultSetExtractor выглядит следующим образом:
/**
* Adapter to enable use of a RowCallbackHandler inside a ResultSetExtractor.
* <p>Uses a regular ResultSet, so we have to be careful when using it:
* We don't use it for navigating since this could lead to unpredictable consequences.
*/
private static class RowCallbackHandlerResultSetExtractor implements ResultSetExtractor<Object> {
private final RowCallbackHandler rch;
public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch) {
this.rch = rch;
}
@Override
public Object extractData(ResultSet rs) throws SQLException {
while (rs.next()) {
this.rch.processRow(rs);
}
return null;
}
}
Поэтому, когда вы используете интерфейс и предоставляете лямбду для отображения строки, не повторяйте ту же ошибку, которую я сделал, и снова включите цикл while(resultSet.next())
, например, иначе вы увидите, что пропускаете ряд:
// THIS IS BAD AND WILL MAKE YOU SKIP THE FIRST RESULT
new JdbcTemplate(getDataSource()).query(sql, resultSet -> {
while(resultSet.next()) {
myMappingFunction();
}
});
Правильный способ - написать код, отображающий строки:
new JdbcTemplate(getDataSource()).query(sql, resultSet -> {
myMappingFunction();
});