ResultSet в CachedRowSet

Пытаюсь конвертировать с 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. Он также имеет правильные метки. Это не меняет проблемы, но гарантирует, что я не вызываю геттеры для пустого объекта. Это затрудняет понимание проблемы.

Если вы используете Spring-JDBC, попробуйте добавить это как тег.

soufrk 08.06.2018 09:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
878
1

Ответы 1

Метод 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;
    }
}

Другие вопросы по теме