Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的SQL while(set.next())跳过第一个元素?_Java_Mysql_Loops_Jdbc - Fatal编程技术网

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

Java 为什么我的SQL while(set.next())跳过第一个元素?,java,mysql,loops,jdbc,Java,Mysql,Loops,Jdbc,我执行: select * from table_name order by column desc; 我想按顺序看一下这些项目。我从中获得了结果集,并且: while(set.next()) { // processing code } 不幸的是,这跳过了第一个元素。迭代整个结果集并包含第一个元素的最佳方法是什么?使用: set.beforeFirst(); while(set.next()) { // Your code } 这将在推进ResultSet之前运行一次循环

我执行:

select * from table_name order by column desc;
我想按顺序看一下这些项目。我从中获得了
结果集
,并且:

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

使用:

set.beforeFirst();
while(set.next()) {
    // Your code
}
这将在推进
ResultSet
之前运行一次循环体。您不想使用
do
循环(我以前的答案),因为如果查询返回0行,它将抛出异常。

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

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

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

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

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


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

我知道这确实很旧,但我的搜索在这里命中,并且在解决方案对我不起作用之后(仅转发结果集),我相信这个问题从未真正解决过。在我的情况下,我正在做:

jdbcTemplate.query(sql, rs -> {
    while(rs.next()) {
        // processRow
    }
    // no return statement
, args);
然后,我更仔细地研究了正在调用的方法,第二个参数是“RowCallbackHandler”,而不是“ResultsTextRactor”,因此正确使用此代码是:

jdbcTemplate.query(sql, rs -> {
    // processRow
}, args);
这将为您执行“while(rs.next())”循环。
我敢打赌OP和我做的事情是一样的。

谢谢,这是我想到的解决方案之一,但我想征求其他程序员的意见:)如果查询没有结果,块内的代码(通常从ResultSet中获取一些内容)将给出一个异常。不需要进行设置。beforeFirst()出于我在回答中所述的原因以及beforeFirst可以抛出异常(请参阅文档)。@gfelisberto这本不必要,但根据他的说法,这是必要的。也许他正在调用
next()
其他地方。我不确定我得到的“操作需要一个可滚动的结果集,但这个结果集只是向前的”,但是当我只使用“while(rs.next)”时,它跳过了第一行……你确定你在问什么吗?我总是使用set=stmt.executeQuery()然后使用while(set.next()){set.getString(“COLUMN”)}我从未错过任何结果。您应该提供更多上下文(更多代码)。看起来您正在调用
next()在循环之前至少有一次。为什么你建议他调用<代码> Soop.Out.PrtLnn<代码>?这可以在一个更大的应用程序的中间调用,它不使用控制台来做任何事情?你是对的!这是程序员添加异常语句的地方!在企业应用程序的情况下,它必须记录在某个地方。.