Java Result Imposta come verificare se ci sono dei risultati

Il set di risultati non ha alcun metodo per hasNext. Voglio verificare se il resultSet ha alcun valore

è questo il modo corretto

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

Questo è corretto, inizialmente il cursore del ResultSet punta a prima della prima riga, se la prima chiamata a next() restituisce false quindi non c’erano dati nel ResultSet .

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

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

Supponendo che si stia lavorando con un ResultSet appena restituito il cui cursore sta puntando prima della prima riga, un modo più semplice per verificare ciò è chiamare semplicemente isBeforeFirst() . Ciò evita di dover eseguire il back-track se i dati devono essere letti.

Come spiegato nella documentazione , 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"); } 

puoi sempre fare il prossimo in avanti, e basta fare un controllo post loop

 if (!resultSet.next() ) { System.out.println("no data"); } else { do { //statement(s) } while (resultSet.next()); } 

Di solito faresti qualcosa del genere:

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

Se vuoi segnalare un set vuoto, aggiungi una variabile contando gli elementi letti. Se hai solo bisogno di leggere un singolo object, allora il tuo codice è adeguato.

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

C’è un metodo chiamato ” .first () “. È meno esagerato ottenere lo stesso risultato esatto. Controlla se c’è qualcosa nel tuo “set di risultati” e non far avanzare 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 delle 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 ()”. Prima genera un’eccezione se eseguita su un set di risultati dal tipo “inoltra solo”.

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” finché hai un tipo “forward only”. Altrimenti è meno eccessivo usare “first ()”.

Meglio usare ResultSet.next () insieme alla syntax do {…} while () per questo.

La chiamata “check for any results” ResultSet.next () sposta il cursore sulla prima riga, quindi utilizza la syntax do {…} while () per elaborare quella riga mentre continua a elaborare le restanti righe restituite dal ciclo.

In questo modo puoi controllare i risultati, mentre allo stesso tempo processare 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()); } 

Per essere completamente sicuro che il set di risultati sia vuoto o meno 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 lancia una SQLException se quel ResultSet è chiuso / non inizializzato.

Funzionerebbe se vuoi vedere se ci sono delle righe nel set di risultati si.

Nota che next() si sposta sempre alla riga successiva, quindi se stai pianificando di fare una lettura dal set di risultati devi tenerne conto.

L’uso abituale con ResultSet (quando si legge semplicemente) è:

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

Che ovviamente non funzionerà correttamente se hai richiamato next() una volta già 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.

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

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

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

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

Usando resultSet.next () puoi ottenere facilmente il risultato, se resultSet contenga o meno un valore

 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 } 

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

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

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’ object CallableStatement deve essere impostato per consentire all’object ResultSet di andare alla fine e tornare all’inizio.

TYPE_SCROLL_SENSITIVE : l’object ResultSet può spostarsi alla fine e tornare all’inizio. Inoltre può prendere gli ultimi cambiamenti.

CONCUR_READ_ONLY : possiamo leggere i dati dell’object ResultSet, ma non possiamo aggiornarli.

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

Perché se ResultSet non ha raw allora resultSet.first restituisce false.

puoi fare qualcosa di simile

 boolean found = false; while ( resultSet.next() ) { found = true; resultSet.getString("column_name"); } if (!found) System.out.println("No Data"); 

Sto tentando di impostare la riga corrente sul primo indice (che riguarda le chiavi primarie). io suggerirei

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

Quando il ResultSet è popolato, punta a prima della prima riga. Quando lo si imposta sulla prima riga (indicata da rs.absolute(1) ) restituirà true indicando che è stato posizionato correttamente nella riga 1 o falso se la riga non esiste. Possiamo estrapolare questo a

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

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

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

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 */ } 

Questo verificherà le condizioni nulle e vuote dei set di risultati.

Per ulteriori informazioni dettagliate è ansible fare riferimento al seguente documento. CollectionUtils

Perché non utilizzare 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 controlla “if (rs.getRow ()! = 0)” sembra funzionare bene.

Inizialmente, l’object set di risultati (rs) punta al BFR (prima del primo record). Una volta che usiamo rs.next (), il cursore punta al primo record e il rs mantiene “true”. Usando il ciclo while puoi stampare tutti i record della tabella. Dopo che tutti i record sono stati recuperati, il cursore si sposta su ALR (dopo l’ultimo record) e sarà 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 mentre (rs.next ()).