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

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

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

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

Ответы [ 21 ]

1 голос
/ 02 сентября 2014

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

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet
1 голос
/ 11 февраля 2013
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";
1 голос
/ 23 июня 2012
if(resultSet.first) {

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

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

1 голос
/ 20 февраля 2017

Я создал следующий метод, чтобы проверить, является ли 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);
1 голос
/ 24 ноября 2013

Лучше всего проверить первую строку, чтобы при попытке получить данные вы могли избежать ошибки пропуска строки. Примерно так: if (! ResultSet.first ()) {System.out.println ("нет данных"); }

0 голосов
/ 05 апреля 2016

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

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

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

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

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

while(rs.next()){
    //Code
}
0 голосов
/ 20 мая 2014

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

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

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

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

0 голосов
/ 14 марта 2017

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

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

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

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

0 голосов
/ 05 ноября 2014
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 является лучшим вариантом.

0 голосов
/ 11 октября 2017

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

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