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

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

это правильно

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

21 ответов


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

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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()".


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

" проверить любые результаты " вызовите 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());
}

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

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

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


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

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

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

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

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


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

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


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

        if (res.next()) {
            do {

                // successfully in. do the right things.

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

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


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

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

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 - Это лучший вариант.


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

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

if(resultSet.first) {

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

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


вы можете сделать что-то подобное

boolean found = false;

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

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

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

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

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

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

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

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

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

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

Это будет проверять значение null, а также условие пустого результирующего набора.

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


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


первоначально объект результирующего набора (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
    }

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