W Javie próbuję przetestować wartość pustą, z ResultSet, w którym kolumna jest rzutowana na pierwotny typ int .
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
Czy na podstawie powyższego fragmentu kodu jest lepszy sposób i zakładam, że drugi test wasNull () jest zbędny?
Edukuj nas i dziękuję
IF(colName = NULL, 0, colName) AS colName
wSELECT
oświadczeniu (najlepiej w przechowywanym proc). Filozoficznie sprowadza się to do tego, czy DB powinien być zgodny z aplikacją, czy odwrotnie. Ponieważ SQL obsługuje NULL z łatwością, a wielu klientów SQL nie (tj.java.sql.ResultSet
), Wybieram obsługę go w DB, jeśli to możliwe. (To oczywiście zakłada, że koncepcyjnie NULL i zero są równoważne dla twoich celów.)Odpowiedzi:
Domyślną wartością,
ResultSet.getInt
gdy wartość pola jestNULL
zwracana0
, jest również wartością domyślną dlaiVal
deklaracji. W takim przypadku test jest całkowicie zbędny.Jeśli naprawdę chcesz zrobić coś innego, jeśli wartość pola to NULL, sugeruję:
(Edytowane jako komentarz @martin poniżej; kod OP w formie, w jakiej został napisany, nie zostanie skompilowany, ponieważ
iVal
nie został zainicjowany)źródło
getInt()
powinno być tym,getInteger()
które zwraca aInteger
, to znaczy,null
jeśli wartość DB tonull
. Devs naprawdę to zawiedli.0
iNULL
są dwie duże różne rzeczyInne rozwiązanie:
źródło
Myślę, że jest zbędny.
rs.getObject("ID_PARENT")
powinien zwrócićInteger
obiekt lubnull
, jeśli wartość kolumny faktycznie byłaNULL
. Dlatego powinno być możliwe zrobienie czegoś takiego:źródło
getObject
niekoniecznie zwraca liczbę całkowitą, ze względu na charakter typu kolumny w bazie danych Oracle, której używam („liczba”).Types.BIGINT
(które powinno być zamapowane na aLong
)getObject()
metoda zwraca 0 zamiast null.rs.getObject("ID_PARENT", Integer.class)
Wystarczy sprawdzić, czy pole jest używane,
null
czy nieResultSet#getObject()
. Zastąp-1
dowolną wartością zerową.Lub, jeśli możesz zagwarantować, że użyjesz odpowiedniego typu kolumny DB, tak aby
ResultSet#getObject()
naprawdę zwróciłInteger
(a więc nieLong
,Short
lubByte
), możesz po prostu rzutować go na typInteger
.źródło
AFAIK, którego możesz po prostu użyć
nawet jeśli jest NULL.
źródło
Tylko aktualizacja z Java Generics.
Można utworzyć metodę narzędzia do pobierania opcjonalnej wartości dowolnego typu Java z danego zestawu wyników, wcześniej rzutowanego.
Niestety getObject (columnName, Class) nie zwraca null, ale domyślną wartość dla danego typu Java, więc wymagane są 2 wywołania
W tym przykładzie Twój kod może wyglądać jak poniżej:
Chętnie poznamy Twoją opinię
źródło
Możesz wywołać tę metodę za pomocą metody wynikowej i nazwy kolumny o typie Liczba. Zwróci wartość całkowitą lub zero. W bazie danych nie będzie zwracanych zer
źródło
W java 8 możesz to zrobić:
W takim przypadku upewnisz się, że wartość nVal będzie równa null (a nie zero), jeśli wartość SQL to NULL
źródło
resultSet.getInt("col_name")
if (rs.wasNull())
Dla wygody możesz utworzyć klasę opakowania wokół ResultSet, która zwraca wartości null, gdy
ResultSet
zwykle tego nie robi .źródło
Innym dobrym sposobem sprawdzenia, czy masz kontrolę nad SQL, jest dodanie wartości domyślnej w samym zapytaniu dla kolumny int. Następnie po prostu sprawdź tę wartość.
np. w przypadku bazy danych Oracle użyj NVL
następnie sprawdź
Oczywiście jest to również założone, że istnieje wartość, której normalnie nie można znaleźć w kolumnie.
źródło