Java ResultSet, как проверить, есть ли какие-либо результаты

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

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

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

Ответ 1

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

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

Следует отметить, что Ответ Seifer ниже - более элегантное решение этого вопроса.

Ответ 2

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

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

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

 

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Вызов ResetSet.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());
}

Ответ 6

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

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

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

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

Вы также можете просто вызвать isBeforeFirst(), чтобы проверить, есть ли какие-либо строки, возвращенные без продвижения курсора, а затем продолжить нормально. - SnakeDoc Sep 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()".

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

Это практичный и легкий читаемый фрагмент, который я считаю.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }

Ответ 11

if(reset.first) {

} else { 
    system.out.println("No raw or reset is empty");
}

Потому что если ResultSet не имеет raw, тогда reset.first возвращает false.

Ответ 12

ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";

Ответ 13

Самое лучшее, что можно сделать, это проверить первую строку, чтобы при намеревании получить данные можно избежать ошибки пропуска строки. Что-то вроде: if (! ResultSet.first()) {System.out.println( "no data" ); }

Ответ 14

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

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet

Ответ 15

ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

Лучше повторить запрос, потому что, когда мы вызываем if(rs.next()){....}, первая строка ResultSet будет выполнена, а после нее внутри while(rs.next()){....} мы получим результат из следующей строки. Поэтому я считаю, что повторное выполнение запроса внутри if является лучшим вариантом.

Ответ 16

Я создал следующий метод, чтобы проверить, является ли ResultSet пустым.

public static boolean resultSetIsEmpty(ResultSet rs){        
    try {
        // We point the last row
        rs.last();
        int rsRows=rs.getRow(); // get last row number

        if (rsRows == 0) {
            return true;
        }

        // It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
        rs.beforeFirst();
        return false;
    }catch(SQLException ex){            
        return true;
    }
}

Очень важно иметь следующие соображения:

Объект

CallableStatement должен быть настроен так, чтобы объект ResultSet шел в конце и возвращался к началу.

TYPE_SCROLL_SENSITIVE: объект ResultSet может перемещаться в конце и вернуться к началу. Дальше можно перехватить последние изменения.

CONCUR_READ_ONLY. Мы можем прочитать данные объекта ResultSet, но не можем обновить.

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

Ответ 17

вы можете сделать что-то вроде этого

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");

Ответ 18

Я пытаюсь установить текущую строку в первый индекс (имеющий дело с первичными ключами). Я бы предложил

if(rs.absolute(1)){
    System.out.println("We have data");
} else {
    System.out.println("No data");
}

Когда ResultSet заполняется, он указывает перед первой строкой. При установке его в первую строку (обозначенную rs.absolute(1)) он вернет истину, обозначив, что она была успешно помещена в строку 1, или false, если строка не существует. Мы можем экстраполировать это на

for(int i=1; rs.absolute(i); i++){
    //Code
}

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

while(rs.next()){
    //Code
}

Ответ 19

Я думаю, что самый простой способ проверить набор результатов - через CollectionUtils в пакете org.apache.commons.collections.CollectionUtils

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

Это будет проверять как пустое, так и пустое условие набора результатов.

Для получения более подробной информации вы можете обратиться к следующему документу. CollectionUtils

Ответ 20

Почему бы не использовать rs.getRow()?

int getRow()
           throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2

Для меня проверка "if (rs.getRow()!= 0)", похоже, работает нормально.

Ответ 21

Изначально объект результирующего набора (rs) указывает на BFR (перед первой записью). Когда мы используем rs.next(), курсор указывает на первую запись, а rs имеет значение "true". Используя цикл while, вы можете распечатать все записи таблицы. После того, как все записи будут восстановлены, курсор переместится на ALR (после последней записи), и будет установлено значение null. Давайте рассмотрим, что в таблице есть 2 записи.

if(rs.next()==false){
    // there are no records found
    }    

while (rs.next()==true){
    // print all the records of the table
    }

Вкратце, мы можем также записать условие как while (rs.next()).