Die Ergebnismenge hat keine Methode für hasNext. Ich möchte überprüfen, ob das resultSet einen Wert hat
Ist das der richtige Weg?
if (!resultSet.next() ) {
System.out.println("no data");
}
Die Ergebnismenge hat keine Methode für hasNext. Ich möchte überprüfen, ob das resultSet einen Wert hat
Ist das der richtige Weg?
if (!resultSet.next() ) {
System.out.println("no data");
}
Antworten:
Das ist richtig, anfangs zeigt der
ResultSet
Cursor vor der ersten Zeile auf. Wenn der erste Aufrufnext()
zurückkehrt,false
waren keine Daten in derResultSet
.Wenn Sie diese Methode verwenden, müssen Sie möglicherweise
beforeFirst()
sofort danach aufrufen , um sie zurückzusetzen, da sie sich jetzt hinter der ersten Zeile positioniert hat.Es sollte jedoch beachtet werden, dass Seifers Antwort unten eine elegantere Lösung für diese Frage ist.
quelle
isBeforeFirst()
, um zu testen, ob Zeilen zurückgegeben werden, ohne den Cursor zu bewegen, und dann normal fortfahren.Angenommen, Sie arbeiten mit einem neu zurückgegebenen
ResultSet
Benutzer, dessen Cursor vor der ersten Zeile zeigt, können Sie dies einfacher überprüfen, indem Sie einfach aufrufenisBeforeFirst()
. Dies vermeidet das Zurückverfolgen, wenn die Daten gelesen werden sollen.Wie in der Dokumentation erläutert , gibt dies false zurück, wenn sich der Cursor nicht vor dem ersten Datensatz befindet oder wenn das ResultSet keine Zeilen enthält .
quelle
Sie könnten immer die nächste im Voraus machen und einfach eine Post-Loop-Prüfung durchführen
quelle
Normalerweise würden Sie so etwas tun:
Wenn Sie einen leeren Satz melden möchten, fügen Sie eine Variable hinzu, die die gelesenen Elemente zählt. Wenn Sie nur einen einzelnen Artikel lesen müssen, ist Ihr Code ausreichend.
quelle
Um ganz sicher zu sein, dass die Ergebnismenge unabhängig von der Cursorposition leer ist oder nicht, würde ich Folgendes tun:
Diese Funktion gibt true zurück, wenn ResultSet leer ist, false, wenn nicht, oder löst eine SQLException aus, wenn das ResultSet geschlossen / nicht initialisiert ist.
quelle
Verwenden Sie hierfür am besten ResultSet.next () zusammen mit der Syntax do {...} while ().
Der Aufruf "Nach Ergebnissen suchen" beim Aufrufen von ResultSet.next () bewegt den Cursor in die erste Zeile. Verwenden Sie daher die Syntax do {...} while (), um diese Zeile zu verarbeiten, während Sie die verbleibenden von der Schleife zurückgegebenen Zeilen weiter verarbeiten.
Auf diese Weise können Sie nach Ergebnissen suchen und gleichzeitig alle zurückgegebenen Ergebnisse verarbeiten.
quelle
Nach der brauchbarsten Antwort wird vorgeschlagen, "isBeforeFirst ()" zu verwenden. Dies ist nicht die beste Lösung, wenn Sie keinen "Nur-Weiterleitungstyp" haben .
Es gibt eine Methode namens " .first () ". Es ist weniger übertrieben, genau das gleiche Ergebnis zu erzielen. Sie überprüfen, ob sich etwas in Ihrer "Ergebnismenge" befindet, und bewegen den Cursor nicht weiter.
In der Dokumentation heißt es: "(...) false, wenn die Ergebnismenge keine Zeilen enthält ".
Es gibt jedoch einen Unterschied zwischen "isBeforeFirst ()" und "first ()". Erzeugt zuerst eine Ausnahme, wenn dies für eine Ergebnismenge vom Typ "Nur weiterleiten" erfolgt.
Vergleichen Sie die beiden Wurfabschnitte: 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 ()
Okay, im Grunde bedeutet dies, dass Sie "isBeforeFirst" verwenden sollten, solange Sie einen "nur vorwärts" -Typ haben. Ansonsten ist es weniger übertrieben, "first ()" zu verwenden.
quelle
Das würde funktionieren, wenn Sie sehen möchten, ob die Ergebnismenge Zeilen enthält. Ja.
Beachten Sie, dass
next()
immer in die nächste Zeile gewechselt wird. Wenn Sie also vorhaben, aus der Ergebnismenge zu lesen, müssen Sie dies berücksichtigen.Die übliche Verwendung mit ResultSet (beim einfachen Lesen) ist:
Was offensichtlich nicht richtig funktioniert, wenn Sie
next()
bereits einmal aufgerufen haben , um zu überprüfen, ob die Ergebnismenge leer war. Achten Sie also darauf. Obwohl es Methoden zum "Sichern" gibt, werden sie nicht für alle Arten von Ergebnismengen unterstützt.quelle
Dies ist ein praktisches und leicht zu lesendes Stück, glaube ich.
quelle
isAfterLast()
gibt auch false für leere Ergebnismenge zurück, aber da sich der Cursor sowieso vor der ersten Zeile befindet, scheint diese Methode klarer zu sein.quelle
Denn wenn ResultSet kein Raw hat, wird
resultSet.first
false zurückgegeben.quelle
Am besten überprüfen Sie die erste Zeile, damit Sie den Fehler beim Überspringen einer Zeile vermeiden können, wenn Sie die Daten abrufen möchten. So etwas wie: if (! ResultSet.first ()) {System.out.println ("keine Daten"); }}
quelle
Mit resultSet.next () können Sie das Ergebnis leicht abrufen, unabhängig davon, ob resultSet einen beliebigen Wert enthält oder nicht
quelle
quelle
Ich habe versucht, die aktuelle Zeile auf den ersten Index zu setzen (mit Primärschlüsseln). ich würde vorschlagen
Wenn das ResultSet ausgefüllt ist, zeigt es vor der ersten Zeile. Wenn Sie es auf die erste Zeile setzen (angezeigt durch
rs.absolute(1)
), wird true zurückgegeben, was bedeutet, dass es erfolgreich in Zeile 1 platziert wurde, oder false, wenn die Zeile nicht vorhanden ist. Wir können dies auf extrapolierenDies setzt die aktuelle Zeile auf Position i und schlägt fehl, wenn die Zeile nicht vorhanden ist. Dies ist nur eine alternative Methode zu
quelle
Ich habe die folgende Methode erstellt, um zu überprüfen, ob ein ResultSet leer ist.
Es ist sehr wichtig, die folgenden Überlegungen zu berücksichtigen:
Das CallableStatement- Objekt muss so eingestellt werden, dass das ResultSet-Objekt am Ende und wieder oben angezeigt wird.
TYPE_SCROLL_SENSITIVE : Das ResultSet-Objekt kann am Ende verschoben und wieder nach oben verschoben werden. Weitere können letzte Änderungen abfangen.
CONCUR_READ_ONLY : Wir können die ResultSet-Objektdaten lesen, aber nicht aktualisieren.
quelle
Ich denke, der einfachste Weg, die Ergebnismenge zu überprüfen, ist über CollectionUtils unter dem Paket org.apache.commons.collections.CollectionUtils
Dadurch wird sowohl nach null als auch nach leeren Ergebnismengen gesucht.
Weitere Informationen finden Sie im folgenden Dokument. CollectionUtils
quelle
Warum nicht rs.getRow () verwenden?
Für mich scheint "if (rs.getRow ()! = 0)" gut zu funktionieren.
quelle
Sie können so etwas tun
quelle
Es ist besser, die Abfrage erneut auszuführen, da beim Aufruf der
if(rs.next()){....}
ersten Zeile von ResultSet die Ausführung ausgeführt wird und danachwhile(rs.next()){....}
das Ergebnis aus der nächsten Zeile angezeigt wird . Daher denke ich, dass die erneute Ausführung der Abfrage im Innerenif
die bessere Option ist.quelle
Zu Beginn zeigt das Ergebnismengenobjekt (rs) auf die BFR (vor dem ersten Datensatz). Sobald wir rs.next () verwenden, zeigt der Cursor auf den ersten Datensatz und das rs hält "true". Mit der while-Schleife können Sie alle Datensätze der Tabelle drucken. Nachdem alle Datensätze abgerufen wurden, bewegt sich der Cursor auf ALR (Nach dem letzten Datensatz) und wird auf Null gesetzt. Nehmen wir an, dass die Tabelle zwei Datensätze enthält.
Kurz gesagt, wir können die Bedingung auch als while (rs.next ()) schreiben.
quelle