首页 > 解决方案 > jdbctemplate 查询游标不在第一行之前

问题描述

我有以下代码。它只是执行一个查询然后导入到另一个数据库,第二部分与我的问题/问题无关。正如我默认看到的 jdbcTemplate.query()在第一个元素之前设置 Cursor 。我不知道我的错误在哪里,但是这段代码跳过了自光标初始状态@first 元素以来的第一行。所以当 while (resultSet.next()) { 开始它跳过第一个元素时......

我试图强行移动光标

resultSet.beforeFirst();

但它会引发错误。目前我在循环之前检查光标位置,我还考虑用 do {} while() 替换。

        jdbcTemplate.query(sqlPull, resultSet -> {
        List<List<Object>> batch = new ArrayList<>();
        ResultSetMetaData metaData = resultSet.getMetaData();

        int batchCount = 1;
        int columnCount = metaData.getColumnCount();
        if (resultSet.getRow() == 1) {
            addAllColumnsToArray(resultSet, batch, columnCount);
        }
        while (resultSet.next()) {
            addAllColumnsToArray(resultSet, batch, columnCount);

            if (batch.size() >= 10000) {
                callRestAPI(batch);
                VaadinSqlApplication.logger.info("Commit batch: " + batchCount++);
                insertTableToDb(sqlPush, push, batch);
                batch.clear();
            }
        }
        callRestAPI(batch);
        VaadinSqlApplication.logger.info("Commit final batch.  " + batchCount);
        insertTableToDb(sqlPush, push, batch);
        batch.clear();
    });

……

    private void addAllColumnsToArray(ResultSet resultSet, List<List<Object>> batch, int columnCount)
        throws SQLException {
    List<Object> row = new ArrayList<>();
    for (int i = 1; i <= columnCount; i++) {
        row.add(resultSet.getObject(i));
    }
    batch.add(row);
}

标签: javaspringjdbctemplate

解决方案


你可以试试do{...}while()

// ...
do{
    addAllColumnsToArray(resultSet, batch, columnCount);

    if (batch.size() >= 10000) {
        callRestAPI(batch);
        VaadinSqlApplication.logger.info("Commit batch: " + batchCount++);
        insertTableToDb(sqlPush, push, batch);
        batch.clear();
    }
}while(resultSet.next());
//...

推荐阅读