In Java versuche ich, aus einem ResultSet, in dem die Spalte in einen primitiven int- Typ umgewandelt wird, auf einen Nullwert zu testen .
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
Gibt es aus dem obigen Codefragment einen besseren Weg, dies zu tun, und ich gehe davon aus, dass der zweite wasNull () -Test redundant ist?
Erziehe uns und danke
IF(colName = NULL, 0, colName) AS colName
dieSELECT
Anweisung einzugeben (vorzugsweise in einem gespeicherten Prozess). Philosophisch kommt es darauf an, ob die DB der App entsprechen soll oder umgekehrt. Da SQL NULL-Werte problemlos handhabt und viele SQL-Konsumenten dies nicht tun (dhjava.sql.ResultSet
), entscheide ich mich, sie nach Möglichkeit in der Datenbank zu behandeln. (Dies setzt natürlich voraus, dass konzeptionell NULL und Null für Ihre Zwecke gleichwertig sind.)Antworten:
Der Standardwert für
ResultSet.getInt
den Feldwert istNULL
die Rückgabe0
. Dies ist auch der Standardwert für IhreiVal
Deklaration. In diesem Fall ist Ihr Test vollständig redundant.Wenn Sie tatsächlich etwas anderes tun möchten, wenn der Feldwert NULL ist, schlage ich vor:
(Bearbeitet als @martin-Kommentare unten; der geschriebene OP-Code würde nicht kompiliert, da er
iVal
nicht initialisiert ist.)quelle
getInt()
sollte sein,getInteger()
was ein zurückgibtInteger
,null
wenn der DB-Wert istnull
. Die Entwickler haben das wirklich durcheinander gebracht.0
undNULL
sind zwei große verschiedene DingeEine andere Lösung:
quelle
Ich denke, es ist überflüssig.
rs.getObject("ID_PARENT")
sollte einInteger
Objekt zurückgeben odernull
, wenn der Spaltenwert tatsächlich warNULL
. Es sollte also sogar möglich sein, etwas zu tun wie:quelle
getObject
aufgrund der Art des Spaltentyps in der von mir verwendeten Oracle-Datenbank ("Nummer") nicht unbedingt eine Ganzzahl zurückgibt.Types.BIGINT
(das sollte a zugeordnet werdenLong
) gibt diegetObject()
Methode 0 anstelle von null zurück.rs.getObject("ID_PARENT", Integer.class)
Überprüfen Sie einfach, ob das Feld verwendet wird
null
oder nichtResultSet#getObject()
. Ersetzen Sie-1
durch einen beliebigen Null-Fall-Wert.Oder, wenn Sie können garantieren , dass Sie den richtigen DB Spaltentyp verwenden , so dass
ResultSet#getObject()
wirklich eine gibtInteger
(und somit nichtLong
,Short
oderByte
), dann können Sie auch Typumwandlung es nur einenInteger
.quelle
AFAIK können Sie einfach verwenden
selbst wenn es NULL ist.
quelle
Nur ein Update mit Java Generics.
Sie können eine Dienstprogrammmethode erstellen, um einen optionalen Wert eines beliebigen Java-Typs aus einem zuvor erstellten ResultSet abzurufen.
Leider gibt getObject (columnName, Class) nicht null zurück, sondern den Standardwert für den angegebenen Java-Typ, sodass 2 Aufrufe erforderlich sind
In diesem Beispiel könnte Ihr Code wie folgt aussehen:
Freut mich über Feedback
quelle
Sie können diese Methode mit dem resultSet und dem Spaltennamen vom Typ Number aufrufen. Es wird entweder der Integer-Wert oder null zurückgegeben. Für den leeren Wert in der Datenbank werden keine Nullen zurückgegeben
quelle
Mit Java 8 können Sie dies tun:
In diesem Fall stellen Sie sicher, dass nVal null (und nicht null) ist, wenn der SQL-Wert NULL ist
quelle
resultSet.getInt("col_name")
if (rs.wasNull())
Der Einfachheit halber können Sie eine Wrapper-Klasse um ResultSet erstellen, die Nullwerte zurückgibt, wenn dies
ResultSet
normalerweise nicht der Fall ist .quelle
Eine andere gute Möglichkeit zu überprüfen, ob Sie die SQL-Kontrolle haben, besteht darin, der Abfrage selbst einen Standardwert für Ihre int-Spalte hinzuzufügen. Dann überprüfen Sie einfach diesen Wert.
Verwenden Sie beispielsweise für eine Oracle-Datenbank NVL
dann überprüfe
Dies setzt natürlich auch voraus, dass es einen Wert gibt, der normalerweise nicht in der Spalte gefunden wird.
quelle