Пытаюсь конвертировать с ResultSet в CachedRowSet/CachedRowSetImpl. ResultSet кажется пустым после метода заполнения, но также и CachedRowSet. Я искал повсюду, пробуя разные подходы (включая Factory). Ниже приведен фрагмент кода с некоторыми сведениями о том, что происходит.
class ResultSetMapper implements RowMapper<CachedRowSet>{
@Override
public CachedRowSet map(ResultSet rs, StatementContext ctx) throws SQLException {
//CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
System.out.println(rs.getLong("something")); -> This gets printed
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
System.out.println(crs.getInt("something"); -> ArrayIndexOutOfBoundsException (mostly -1, sometimes returning 0)
System.out.println(rs.getLong("something")); -> This doesn't get printed
System.out.println(crs.size()); -> 0
return crs;
}
}
Мы будем благодарны за любую помощь или понимание этой проблемы!
Обновлено: через некоторую отладку я обнаружил, что CachedRowSet - это не пустой. RowSetMD.colCount = 3. Он также имеет правильные метки. Это не меняет проблемы, но гарантирует, что я не вызываю геттеры для пустого объекта. Это затрудняет понимание проблемы.




Метод CachedRowSet::populate считывает все строки с вашего ResultSet. С этого момента звонить в rs.next() уже нельзя. Вам следует использовать csr.next().
class ResultSetMapper implements RowMapper<CachedRowSet>{
@Override
public CachedRowSet map(ResultSet rs, StatementContext ctx) throws SQLException {
CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(rs);
while (csr.next()) {
System.out.println(crs.getInt("something"));
}
// ...
return null;
}
}
Если вы используете
Spring-JDBC, попробуйте добавить это как тег.