Risultati Java Impostare come verificare se ci sono risultati


311

resultset non ha alcun metodo per hasNext. Voglio verificare se il resultSet ha qualche valore

è questo il modo corretto

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

2
Per i futuri lettori come me: le risposte che mi hanno aiutato sono quelle di Felype e Dermot Doherty
Benj,

Risposte:


238

È corretto, inizialmente il ResultSetcursore punta prima della prima riga, se la prima chiamata next()ritorna, falseallora non c'erano dati nel file ResultSet.

Se si utilizza questo metodo, potrebbe essere necessario chiamare beforeFirst() subito dopo per ripristinarlo, poiché ora si è posizionato oltre la prima riga.

Va notato tuttavia che la risposta di Seifer di seguito è una soluzione più elegante a questa domanda.


37
Ma tieni a mente, se ci sono / sono / righe, dopo quel test indicherai la prima riga. Quindi assicurati di non saltare accidentalmente una riga.
Matthew Flaschen,

1
Buon punto che il cursore (puntatore) punta sulla prima riga
John Merlino,

@MatthewFlaschen, hai ragione, per risolvere il problema di saltare la prima riga, ho usato do {...} while (rs.next);
Israelm,

8
Puoi anche semplicemente chiamare isBeforeFirst()per verificare se ci sono righe restituite senza far avanzare il cursore, quindi procedere normalmente.
SnakeDoc

528

Supponendo che tu stia lavorando con un nuovo restituito il ResultSetcui cursore punta prima della prima riga, un modo più semplice per verificare questo è semplicemente chiamareisBeforeFirst() . Questo evita di dover tornare indietro se i dati devono essere letti.

Come spiegato nella documentazione , questo restituisce false se il cursore non si trova prima del primo record o se non ci sono righe nel ResultSet .

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

 


15
Grazie, sì, lo so, ma ho riscontrato lo stesso problema e non ero soddisfatto dell'aspetto di andare avanti per controllare, quindi per leggere all'indietro. Ho pensato che questa soluzione più semplice avrebbe giovato anche agli altri che si trovano nella stessa situazione.
Seifer,

5
Si noti che, almeno per DB2, il set di risultati deve essere di tipo "scorrevole". Questo può essere impostato quando si crea l'istruzione da eseguire.
Laurence Dougal Myers il


Dalla documentazione Oracle: Nota: il supporto per il metodo isBeforeFirst è facoltativo per i ResultSet con un tipo di set di risultati di TYPE_FORWARD_ONLY
emi-le

52

potresti sempre fare il prossimo passo avanti e fare solo un controllo post loop

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

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

21

Di solito faresti qualcosa del genere:

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

Se si desidera segnalare un set vuoto, aggiungere una variabile contando gli elementi letti. Se hai solo bisogno di leggere un singolo elemento, il tuo codice è adeguato.


16

Per essere totalmente sicuro piuttosto che il set di risultati sia vuoto o no indipendentemente dalla posizione del cursore, farei qualcosa del genere:

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

Questa funzione restituirà true se ResultSet è vuoto, false in caso contrario o genera un'eccezione SQLE se tale ResultSet è chiuso / non inizializzato.


12

È meglio usare ResultSet.next () insieme alla sintassi do {...} while () per questo.

La chiamata "controlla eventuali risultati" ResultSet.next () sposta il cursore sulla prima riga, quindi usa la sintassi do {...} while () per elaborare quella riga mentre continua a elaborare le restanti righe restituite dal ciclo.

In questo modo è possibile verificare la presenza di risultati, mentre allo stesso tempo elaborare anche i risultati restituiti.

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

Secondo la risposta più valida, il suggerimento è di usare "isBeforeFirst ()". Questa non è la soluzione migliore se non si dispone di un "tipo solo forward" .

C'è un metodo chiamato " .first () ". È meno eccessivo ottenere lo stesso risultato esatto. Controlla se c'è qualcosa nel tuo "gruppo di risultati" e non avanzi il cursore.

La documentazione afferma: "(...) false se non ci sono righe nel set di risultati ".

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

Puoi anche chiamare isBeforeFirst () per verificare se ci sono righe restituite senza far avanzare il cursore, quindi procedere normalmente. - SnakeDoc 2 settembre 14 alle 19:00

Tuttavia, c'è una differenza tra "isBeforeFirst ()" e "first ()". Innanzitutto genera un'eccezione se eseguita su un gruppo di risultati dal tipo "solo inoltro".

Confronta le due sezioni di lancio: 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 ()

Ok, in pratica questo significa che dovresti usare "isBeforeFirst" fintanto che hai un tipo "forward only". Altrimenti è meno eccessivo usare "first ()".


1
Come è "meno eccessivo" ottenere esattamente lo stesso risultato? Mi sembra che lo scopo di first () sia di spostare il cursore sulla prima riga se non è già presente (e restituire true se ha avuto successo). isBeforeFirst è solo una funzione puramente diagnostica e sembra più adatta agli scopi dell'autore. Inoltre, il modo in cui first () è formulato, restituisce true fintanto che è "su una riga valida" ... il che è strano come si potrebbe pensare che sarebbe formulato come "sulla prima riga". Per me, non vedo il vantaggio di usare first () in questo scenario a meno che il cursore non sia avanzato e non si desideri riportarlo all'inizio.
Jon,

5

Funzionerebbe se si desidera vedere se ci sono righe nel set di risultati yes.

Nota che next()passa sempre alla riga successiva, quindi se stai pianificando di leggere il set di risultati devi tenerne conto.

L'utilizzo abituale con ResultSet (quando si legge semplicemente) è:

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

Che ovviamente non funzionerà correttamente se hai next()già invocato una volta per verificare se il set di risultati era vuoto, quindi fai attenzione. Sebbene esistano metodi per il "backup", non sono supportati per tutti i tipi di set di risultati.


5

Questo è un pezzo pratico e facile da leggere, credo.

        if (res.next()) {
            do {

                // successfully in. do the right things.

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

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

isAfterLast() restituisce anche false per set di risultati vuoto ma poiché il cursore si trova comunque prima della prima riga, questo metodo sembra più chiaro.


2
if(resultSet.first) {

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

Perché se ResultSet non ha raw, resultSet.firstrestituisce false.


Ma sposta il cursore sulla prima riga non necessario e può confondere l'ulteriore utilizzo dell'oggetto ob "reset" e può perdere dati
Tigran Babajanyan,

Anche se questo sembra migliore, non funzionerà su un gruppo di risultati del cursore solo in avanti.
eliteproxy,

1

La cosa migliore da fare è controllare la prima riga in modo che quando si intende ottenere i dati sia possibile evitare l'errore di saltare una riga. Qualcosa come: if (! ResultSet.first ()) {System.out.println ("nessun dato"); }


1

Usando resultSet.next () è possibile ottenere facilmente il risultato, indipendentemente dal fatto che resultSet contenga un valore

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

Non ripetere le risposte esistenti.
james.garriss,

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

1

Ho tentato di impostare la riga corrente sul primo indice (gestendo le chiavi primarie). io suggerirei

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

Quando il ResultSet viene popolato, punta prima della prima riga. Quando lo si imposta sulla prima riga (indicato da rs.absolute(1)), verrà restituito true, a indicare che è stato posizionato correttamente nella riga 1 o false se la riga non esiste. Possiamo estrapolarlo a

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

che imposta la riga corrente in posizione i e fallirà se la riga non esiste. Questo è solo un metodo alternativo a

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

Qual è la tua risposta?
CMedina,

1

Ho creato il seguente metodo per verificare se un ResultSet è vuoto.

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;
    }
}

È molto importante avere le seguenti considerazioni:

L' oggetto CallableStatement deve essere impostato per lasciare andare l'oggetto ResultSet alla fine e tornare all'inizio.

TYPE_SCROLL_SENSITIVE : l'oggetto ResultSet può spostarsi alla fine e tornare all'inizio. Inoltre, è possibile rilevare le ultime modifiche.

CONCUR_READ_ONLY : possiamo leggere i dati dell'oggetto ResultSet, ma non possiamo aggiornarli.

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

1

Penso che il modo più semplice per controllare il set di risultati sia tramite CollectionUtils nel pacchetto org.apache.commons.collections.CollectionUtils

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

Ciò verificherà la condizione del set di risultati null e vuota.

Per ulteriori informazioni di dettaglio è possibile fare riferimento al seguente documento. CollectionUtils


1
ResultSet non è una raccolta.
Joachim Lous,

1

Perché non usare 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

Per me controllare "if (rs.getRow ()! = 0)" sembra funzionare bene.


0

puoi fare qualcosa del genere

boolean found = false;

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

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

1
WAAAY troppo complicato.
jordaniac89,

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

È meglio rieseguire la query perché quando chiamiamo la if(rs.next()){....}prima riga di ResultSet verrà eseguita e dopo che all'interno while(rs.next()){....}otterremo il risultato dalla riga successiva. Quindi penso che la riesecuzione della query all'interno ifsia l'opzione migliore.


5
-1 Questa non è un'opzione migliore. Perché interrogare il database due volte? Cosa succede se i dati cambiano drasticamente tra le chiamate? Questo è uno spreco.
Toby Caulk,

-2

Inizialmente, l'oggetto set di risultati (rs) punta al BFR (prima del primo record). Quando usiamo rs.next (), il cursore punta sul primo record e rs mantiene "true". Utilizzando il ciclo while è possibile stampare tutti i record della tabella. Dopo aver recuperato tutti i record, il cursore si sposta su ALR (Dopo l'ultimo record) e verrà impostato su null. Consideriamo che ci sono 2 record nella tabella.

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

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

In breve, possiamo anche scrivere la condizione as while (rs.next ()).


3
Il tuo ciclo while non avrà la possibilità di operare sulla prima riga restituita, il che sembra un difetto un po 'fatale con questo approccio. Ci sono molti suggerimenti sopra che sono meglio di questo.
Jules,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.