En Java, estoy tratando de probar un valor nulo, desde un ResultSet, donde la columna se está convirtiendo en un 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");
}
}
Desde el fragmento de código anterior, ¿hay una mejor manera de hacer esto, y supongo que la segunda prueba wasNull () es redundante?
Edúcanos y gracias
IF(colName = NULL, 0, colName) AS colName
en laSELECT
declaración (preferiblemente en un proceso almacenado). Filosóficamente, esto se reduce a si la base de datos debe ajustarse a la aplicación, o viceversa. Dado que SQL maneja NULLs fácilmente y muchos consumidores de SQL no lo hacen (es decirjava.sql.ResultSet
), opto por manejarlo en la base de datos cuando sea posible. (Esto, por supuesto, supone que conceptualmente NULL y zero son equivalentes para sus propósitos.)Respuestas:
El valor predeterminado para
ResultSet.getInt
cuando el valor del campo esNULL
devolver0
, que también es el valor predeterminado para suiVal
declaración. En cuyo caso su prueba es completamente redundante.Si realmente desea hacer algo diferente si el valor del campo es NULL, sugiero:
(Editado como @martin comenta a continuación; el código OP como está escrito no se compilaría porque
iVal
no está inicializado)fuente
getInt()
debería ser elgetInteger()
que devuelve unInteger
es decirnull
si el valor de DB esnull
. Los desarrolladores realmente lo estropearon.0
yNULL
son dos cosas muy diferentesOtra solución:
fuente
Creo que es redundante.
rs.getObject("ID_PARENT")
debería devolver unInteger
objeto onull
, si el valor de la columna realmente fueraNULL
. Por lo tanto, incluso debería ser posible hacer algo como:fuente
getObject
no necesariamente devuelven un número entero, debido a la naturaleza del tipo de columna en el oráculo db que estoy usando ("Número").Types.BIGINT
(que debería asignarse a aLong
) elgetObject()
método devuelve 0 en lugar de nulo.rs.getObject("ID_PARENT", Integer.class)
Simplemente verifique si el campo está
null
utilizando o noResultSet#getObject()
. Sustituya-1
con el valor de mayúsculas y minúsculas que desee.O bien, si puede garantizar que utiliza el tipo de columna de base de datos correcto para que
ResultSet#getObject()
realmente devuelva unInteger
(y, por lo tantoLong
, no ,Short
oByte
), también puede simplemente escribirlo en unInteger
.fuente
AFAIK simplemente puedes usar
incluso si es NULL.
fuente
Solo una actualización con Java Generics.
Podría crear un método de utilidad para recuperar un valor opcional de cualquier tipo de Java de un ResultSet dado, previamente emitido.
Desafortunadamente, getObject (columnName, Class) no devuelve nulo, pero el valor predeterminado para un tipo de Java dado, por lo que se requieren 2 llamadas
En este ejemplo, su código podría verse a continuación:
Feliz de recibir comentarios
fuente
Puede llamar a este método usando resultSet y el nombre de la columna que tiene el tipo Number. Devolverá el valor entero o nulo. No habrá ceros devueltos por valor vacío en la base de datos
fuente
Con java 8 puedes hacer esto:
En ese caso, se asegura de que nVal será nulo (y no cero) si el valor de SQL es NULL
fuente
resultSet.getInt("col_name")
if (rs.wasNull())
Para mayor comodidad, puede crear una clase de contenedor alrededor de ResultSet que devuelva valores nulos cuando
ResultSet
normalmente no lo haría.fuente
Otra buena manera de verificar, si tiene control del SQL, es agregar un valor predeterminado en la consulta para su columna int. Luego solo verifique ese valor.
por ejemplo, para una base de datos Oracle, use NVL
Entonces revisa
Por supuesto, esto también se da por supuesto que hay un valor que normalmente no se encontraría en la columna.
fuente