Em Java, estou tentando testar um valor nulo, de um ResultSet, onde a coluna está sendo convertida em um tipo int primitivo .
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
No fragmento de código acima, existe uma maneira melhor de fazer isso e suponho que o segundo teste wasNull () seja redundante?
Eduque-nos e obrigado
IF(colName = NULL, 0, colName) AS colName
aSELECT
declaração (de preferência em um processo armazenado). Filosoficamente, isso se resume a se o DB deve estar em conformidade com o aplicativo ou vice-versa. Como o SQL lida com NULLs facilmente e muitos consumidores de SQL não (iejava.sql.ResultSet
), eu opto por lidar com ele no banco de dados sempre que possível. (Isto, naturalmente, assume que NULL conceitualmente e Zero são equivalentes para seus propósitos.)Respostas:
O padrão para
ResultSet.getInt
quando o valor do campo éNULL
retornar0
, que também é o valor padrão para suaiVal
declaração. Nesse caso, seu teste é completamente redundante.Se você realmente deseja fazer algo diferente se o valor do campo for NULL, sugiro:
(Editado como @martin comenta abaixo; o código OP conforme escrito não seria compilado porque
iVal
não foi inicializado)fonte
getInt()
deve ser ogetInteger()
que retorna umInteger
que énull
se o valor do banco de dados énull
. Os desenvolvedores realmente estragaram tudo.0
eNULL
são duas grandes coisas diferentesOutra solução:
fonte
Eu acho que é redundante.
rs.getObject("ID_PARENT")
deve retornar umInteger
objeto ounull
, se o valor da coluna realmente eraNULL
. Portanto, deve ser possível fazer algo como:fonte
getObject
não retorna necessariamente um número inteiro, devido à natureza do tipo de coluna no oracle db que estou usando ("Number").Types.BIGINT
(que deve ser mapeado para aLong
), ogetObject()
método retorna 0 em vez de nulo.rs.getObject("ID_PARENT", Integer.class)
Basta verificar se o campo está
null
ou não em usoResultSet#getObject()
. Substitua-1
pelo valor de nulo desejado.Ou, se você pode garantir que você use o tipo de coluna DB direita para que
ResultSet#getObject()
realmente retorna umInteger
(e, portanto, nãoLong
,Short
ouByte
), então você também pode simplesmente typecast-lo a umInteger
.fonte
AFAIK você pode simplesmente usar
mesmo que seja NULL.
fonte
Apenas uma atualização com o Java Generics.
Você pode criar um método utilitário para recuperar um valor opcional de qualquer tipo Java de um determinado ResultSet, convertido anteriormente.
Infelizmente, getObject (columnName, Class) não retorna nulo, mas o valor padrão para determinado tipo Java, portanto, são necessárias 2 chamadas
Neste exemplo, seu código pode ser parecido abaixo:
É um prazer receber feedback
fonte
Você pode chamar esse método usando resultSet e o nome da coluna com o tipo Number. Ele retornará o valor Inteiro ou nulo. Não haverá zeros retornados para o valor vazio no banco de dados
fonte
Com o java 8, você pode fazer isso:
Nesse caso, você garante que o nVal será nulo (e não zero) se o valor SQL for NULL
fonte
resultSet.getInt("col_name")
if (rs.wasNull())
Por conveniência, você pode criar uma classe de wrapper em torno de ResultSet que retorne valores nulos quando
ResultSet
normalmente não.fonte
Outra boa maneira de verificar, se você controla o SQL, é adicionar um valor padrão na própria consulta para sua coluna int. Em seguida, basta verificar esse valor.
por exemplo, para um banco de dados Oracle, use NVL
então verifique
Obviamente, isso também pressupõe que exista um valor que normalmente não seria encontrado na coluna.
fonte