ResultSet到CachedRowSet

时间:2018-06-08 07:14:51

标签: java jdbc resultset jdbi cachedrowset

我尝试将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.它也有正确的标签。这并没有改变问题,但确保我没有在空对象上调用getter。这使问题更难掌握

1 个答案:

答案 0 :(得分: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;
    }
}