ResultSet to CachedRowSet - PullRequest
       41

ResultSet to CachedRowSet

0 голосов
/ 08 июня 2018

Я пытаюсь конвертировать из ResultSet в CachedRowSet/CachedRowSetImpl.ResultSet кажется пустым после метода заполнения, как и CachedRowSet.Я искал повсюду, пробуя разные подходы (включая Фабрику).Ниже приведен фрагмент кода с некоторыми указаниями на то, что происходит.

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

1 Ответ

0 голосов
/ 18 ноября 2018

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