为什么我的SQL while(set.next())会跳过第一个元素?

时间:2015-07-18 19:02:52

标签: java mysql loops jdbc

我执行:

println("\nPretty JSON Result:\n" + prettyJson)

我想按顺序浏览这些项目。我从那里得到select * from table_name order by column desc; 并做了:

ResultSet

不幸的是,它跳过了第一个元素。迭代整个while(set.next()) { // processing code } 并包含第一个元素的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

使用:

set.beforeFirst();
while(set.next()) {
    // Your code
}

这会在推进ResultSet之前运行循环体。您不想使用do循环(我以前的答案),因为如果查询返回0行,它将抛出异常。

答案 1 :(得分:3)

您的代码是正确的,并且您没有丢失任何记录。在ResultSet的SDK文档中,您可以阅读:

" ResultSet对象维护一个指向其当前数据行的游标。 最初光标位于第一行之前。下一个方法将光标移动到下一行,因为当ResultSet对象中没有更多行时它返回false,它可以用于while循环迭代结果集。"

如果您在显示的结果之前执行resultSet.next(),则只有情况可能会丢失记录。

答案 2 :(得分:0)

每当调用next()时,它都会从结果集中读取记录。

if (!set.next() ) {
    System.out.println("no data");
} else {

    do {
        //statement(s)
    } while (resultSet.next());
}

答案 3 :(得分:0)

我知道这确实很老,但是我的搜索在这里找到,解决方案对我不起作用(仅转发结果集)后,我认为这个问题从未得到真正解决。就我而言,我在做:

jdbcTemplate.query(sql, rs -> {
    while(rs.next()) {
        // processRow
    }
    // no return statement
, args);

然后我仔细查看正在调用的方法,第二个参数是“ RowCallbackHandler”而不是“ ResultSetExtractor”,因此此代码的正确用法是:

jdbcTemplate.query(sql, rs -> {
    // processRow
}, args);

这为您执行了“ while(rs.next())”循环。 我打赌OP会做与我相同的事情。