Di Jawa saya mencoba untuk menguji nilai nol, dari ResultSet, di mana kolom sedang dilemparkan ke tipe int primitif .
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
Dari fragmen kode di atas, apakah ada cara yang lebih baik untuk melakukan ini, dan saya berasumsi bahwa tes wasNull () kedua adalah mubazir?
Mendidik kami, dan Terima kasih
IF(colName = NULL, 0, colName) AS colName
dalamSELECT
pernyataan (lebih disukai di proc disimpan). Secara filosofis ini bermuara pada apakah DB harus sesuai dengan aplikasi, atau sebaliknya. Karena SQL menangani NULL dengan mudah dan banyak konsumen SQL tidak (yaitujava.sql.ResultSet
), saya memilih untuk menanganinya di DB jika memungkinkan. (Ini, tentu saja, mengasumsikan bahwa secara konsep NULL dan nol adalah ekuivalen untuk keperluan Anda.)Jawaban:
Default untuk
ResultSet.getInt
ketika nilai bidangNULL
adalah kembali0
, yang juga merupakan nilai default untukiVal
deklarasi Anda . Dalam hal ini tes Anda benar-benar berlebihan.Jika Anda benar-benar ingin melakukan sesuatu yang berbeda jika nilai bidangnya NULL, saya sarankan:
(Diedit sebagai komentar @martin di bawah ini; kode OP yang ditulis tidak akan dikompilasi karena
iVal
tidak diinisialisasi)sumber
getInt()
seharusnyagetInteger()
yang mengembalikanInteger
itu adalahnull
jika nilai DB adalahnull
. Para devs benar-benar mengacaukan yang satu ini.0
danNULL
dua hal besar yang berbedaSolusi lain:
sumber
Saya pikir, itu berlebihan.
rs.getObject("ID_PARENT")
harus mengembalikanInteger
objek ataunull
, jika nilai kolom sebenarnyaNULL
. Jadi bahkan mungkin untuk melakukan sesuatu seperti:sumber
getObject
tidak selalu menghasilkan Integer, karena sifat tipe kolom dalam oracle db yang saya gunakan ("Number").Types.BIGINT
(yang harus dipetakan ke aLong
)getObject()
metode mengembalikan 0 bukannya nol.rs.getObject("ID_PARENT", Integer.class)
Periksa saja apakah bidangnya sedang
null
atau tidak digunakanResultSet#getObject()
. Ganti-1
dengan nilai null-case apa pun yang Anda inginkan.Atau, jika Anda bisa menjamin bahwa Anda menggunakan tipe kolom DB yang tepat sehingga
ResultSet#getObject()
benar - benar mengembalikanInteger
(dan dengan demikian tidakLong
,Short
atauByte
), maka Anda juga bisa mengetikkannya keInteger
.sumber
AFAIK cukup Anda gunakan
bahkan jika itu NULL.
sumber
Hanya pembaruan dengan Java Generics.
Anda bisa membuat metode utilitas untuk mengambil nilai opsional dari tipe Java apa pun dari ResultSet yang diberikan, yang sebelumnya dibuat.
Sayangnya, getObject (columnName, Class) tidak menghasilkan null, tetapi nilai default untuk tipe Java yang diberikan, sehingga diperlukan 2 panggilan
Dalam contoh ini, kode Anda dapat terlihat seperti di bawah ini:
Senang mendapatkan umpan balik
sumber
Anda dapat memanggil metode ini menggunakan resultSet dan nama kolom yang memiliki tipe angka. Ini akan mengembalikan nilai Integer, atau null. Tidak akan ada nol yang dikembalikan untuk nilai kosong di database
sumber
Dengan java 8 Anda dapat melakukan ini:
Dalam hal ini Anda memastikan bahwa nVal akan menjadi nol (dan bukan nol) jika nilai SQL NULL
sumber
resultSet.getInt("col_name")
if (rs.wasNull())
Untuk kenyamanan, Anda bisa membuat kelas pembungkus di sekitar ResultSet yang mengembalikan nilai nol ketika
ResultSet
biasanya tidak.sumber
Cara pemeriksaan lain yang bagus, jika Anda telah mengontrol SQL, adalah dengan menambahkan nilai default dalam kueri itu sendiri untuk kolom int Anda. Maka cukup periksa nilai itu.
misalnya untuk database Oracle, gunakan NVL
lalu periksa
Tentu saja ini juga dengan asumsi bahwa ada nilai yang biasanya tidak ditemukan di kolom.
sumber