que - resultset java example
ComprobaciĆ³n de un valor int nulo desde un ResultSet de Java (9)
En Java estoy intentando probar un valor nulo, desde un ResultSet, donde la columna se convierte a 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 asumo que la segunda prueba wasNull() es redundante?
Educanos y gracias
AFAIK simplemente puede utilizar
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// do somthing interesting to handle this situation
}
incluso si es NULL.
Con java 8 puedes hacer esto:
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::longValue).orElse(null));
En ese caso, asegúrese de que el nVal sea nulo (y no cero) si el valor de SQL es NULL
Creo que es redundante. rs.getObject("ID_PARENT")
debe devolver un objeto Integer
o un null
, si el valor de la columna era NULL
. Así que incluso debería ser posible hacer algo como:
if (rs.next()) {
Integer idParent = (Integer) rs.getObject("ID_PARENT");
if (idParent != null) {
iVal = idParent; // works for Java 1.5+
} else {
// handle this case
}
}
El valor predeterminado para ResultSet.getInt
cuando el valor del campo es NULL
es devolver 0
, que también es el valor predeterminado para su declaración iVal
. En cuyo caso su prueba es completamente redundante.
Si realmente quieres hacer algo diferente si el valor del campo es NULL, te sugiero:
int iVal = 0;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// handle NULL field value
}
}
(Editado como comentarios de @martin a continuación; el código OP como está escrito no se compilaría porque iVal
no está inicializado)
Otra buena forma de verificar, si tiene el control del SQL, es agregar un valor predeterminado en la consulta para su columna int. Entonces simplemente compruebe ese valor.
por ejemplo, para una base de datos Oracle, use NVL
SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
Entonces revisa
if (rs.getInt(''ID_PARENT'') != -999)
{
}
Por supuesto, esto también está bajo el supuesto de que hay un valor que normalmente no se encuentra en la columna.
Otra solución:
public class DaoTools {
static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
int nValue = rs.getInt(strColName);
return rs.wasNull() ? null : nValue;
}
}
Para su comodidad, puede crear una clase de envoltorio alrededor de ResultSet que devuelva valores nulos cuando ResultSet
normalmente no lo haría.
public final class ResultSetWrapper {
private final ResultSet rs;
public ResultSetWrapper(ResultSet rs) {
this.rs = rs;
}
public ResultSet getResultSet() {
return rs;
}
public Boolean getBoolean(String label) throws SQLException {
final boolean b = rs.getBoolean(label);
if (rs.wasNull()) {
return null;
}
return b;
}
public Byte getByte(String label) throws SQLException {
final byte b = rs.getByte(label);
if (rs.wasNull()) {
return null;
}
return b;
}
// ...
}
Simplemente verifique si el campo es null
o no usa ResultSet#getObject()
. Sustituya -1
por cualquier valor de caso nulo que desee.
int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;
O, si puede garantizar que usa el tipo de columna de la base de datos correcta para que ResultSet#getObject()
realmente devuelva un Integer
(y, por lo tanto, no Long
, Short
o Byte
), entonces también puede convertirlo en un Integer
.
Integer foo = (Integer) resultSet.getObject("foo");
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 null, pero el valor predeterminado para un tipo de Java dado, por lo que se requieren 2 llamadas
public <T> T getOptionalValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException {
final T value = rs.getObject(columnName, clazz);
return rs.wasNull() ? null : value;
}
En este ejemplo, su código podría verse a continuación:
final Integer columnValue = getOptionalValue(rs, Integer.class);
if (columnValue == null) {
//null handling
} else {
//use int value of columnValue with autoboxing
}
Feliz de recibir comentarios