Java ResultSet, как проверить, есть ли какие-либо результаты - PullRequest
289 голосов
/ 15 мая 2009

Resultset не имеет метода для hasNext. Я хочу проверить, имеет ли resultSet какое-либо значение

это правильный путь

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

Ответы [ 21 ]

497 голосов
/ 25 июля 2011

Если вы работаете с только что возвращенным ResultSet, курсор которого направлен перед первой строкой, более простой способ проверить это - просто вызвать isBeforeFirst(). Это исключает необходимость повторного отслеживания, если данные должны быть прочитаны.

Как объяснено в документации , возвращается false, если курсор находится не перед первой записью или если нет строк в ResultSet .

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 

221 голосов
/ 15 мая 2009

Это верно, изначально курсор ResultSet указывает на перед первой строкой, если первый вызов next() возвращает false, тогда в ResultSet.

не было никаких данных.

Если вы используете этот метод, вам, возможно, придется вызвать beforeFirst() сразу после этого, чтобы сбросить его, так как теперь он расположен за первой строкой.

Следует отметить, однако, что ответ Зейфера ниже является более элегантным решением этого вопроса.

48 голосов
/ 31 мая 2009

вы всегда можете сделать следующий шаг вперед и просто выполнить проверку после цикла

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

    do {
     //statement(s)
    } while (resultSet.next());
}
19 голосов
/ 15 мая 2009

Обычно вы делаете что-то вроде этого:

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

Если вы хотите сообщить о пустом наборе, добавьте переменную, считающую прочитанные элементы. Если вам нужно прочитать только один элемент, тогда ваш код адекватен.

8 голосов
/ 02 апреля 2013

Чтобы быть полностью уверенным, скорее набор результатов пуст или нет независимо от позиции курсора, я бы сделал что-то вроде этого:

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
    return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

Эта функция будет возвращать значение true, если ResultSet пуст, или false, если нет, или выдавать SQLException, если этот ResultSet закрыт / неинициализирован.

8 голосов
/ 12 декабря 2012

Лучше всего использовать ResultSet.next () вместе с синтаксисом do {...} while () для этого.

Вызов ResultSet.next () для проверки любых результатов перемещает курсор в первую строку, поэтому используйте синтаксис do {...} while () для обработки этой строки, продолжая при этом обрабатывать оставшиеся строки, возвращаемые функцией. цикл.

Таким образом, вы можете проверять любые результаты, в то же время обрабатывая все возвращенные результаты.

if(resultSet.next()) { // Checks for any results and moves cursor to first row,
    do { // Use 'do...while' to process the first row, while continuing to process remaining rows

    } while (resultSet.next());
}
8 голосов
/ 17 февраля 2015

Согласно наиболее жизнеспособному ответу, предлагается использовать isBeforeFirst (). Это не лучшее решение, если у вас нет «только вперед» типа .

Есть метод с именем " .first () ". Это менее излишне, чтобы получить точно такой же результат. Вы проверяете, есть ли что-то в вашем «наборе результатов» и не перемещаете курсор.

В документации говорится: "(...) false, если в наборе результатов нет строк ".

if(rs.first()){
    //do stuff      
}

Вы также можете просто вызвать isBeforeFirst (), чтобы проверить, есть ли какие-либо строки, возвращенные без перемещения курсора, а затем продолжить работу в обычном режиме. - SnakeDoc 2 сентября '14 в 19:00

Однако есть разница между "isBeforeFirst ()" и "first ()". Сначала генерируется исключение, если сделано для набора результатов типа «только вперед».

Сравните две секции броска: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst() http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#first()

Хорошо, в основном это означает, что вы должны использовать «isBeforeFirst», если у вас есть тип «только вперед». В противном случае использовать "first ()" не так уж и сложно.

5 голосов
/ 23 марта 2016

Мне кажется, это практичная и легко читаемая статья.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }
5 голосов
/ 15 мая 2009

Это сработало бы, если вы хотите увидеть, есть ли в результирующем наборе какие-либо строки yes.

Обратите внимание, что next() всегда перемещается к следующей строке, поэтому, если вы планируете делать какие-либо чтения из результирующего набора, вам необходимо это учитывать.

Обычное использование с ResultSet (при простом чтении):

while (resultSet.next())
{
   ... read from the row here ...
}

Что, очевидно, не будет работать правильно, если вы уже однажды вызвали next(), чтобы проверить, был ли набор результатов пуст, так что следите за этим. Хотя существуют методы для «резервного копирования», они не поддерживаются для всех типов наборов результатов.

2 голосов
/ 04 октября 2015
if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

isAfterLast() также возвращает false для пустого набора результатов, но так как курсор в любом случае находится перед первой строкой, этот метод кажется более понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...