¿Cómo puedo leer en JDBC un doble valor, posiblemente nula de conjunto resultado?

StackOverflow https://stackoverflow.com/questions/1103460

  •  12-09-2019
  •  | 
  •  

Pregunta

Tengo una columna en mi base de datos que se escribe double y yo quiero leer el valor de la misma usando un conjunto de resultados JDBC, pero puede ser nulo. Cual es la mejor manera de hacer esto? Se me ocurren tres opciones ninguno de los cuales parece muy bueno.

Opción 1: malo, porque la gestión de excepciones verbosa y maloliente

double d;
try {
   d = rs.getDouble(1);
   // do something
} catch(SQLException ex) {
   if(rs.wasNull()) {
      // do something else
   } else {
     throw ex;
   }
}

Opción 2: Malo porque dos recuperaciones

s = rs.getString(1); // or getObject()
if(s == null) {
  // do something else
} else {
  double d = rs.getDouble(1);
  // do something
}

Opción 3: malo porque Java en lugar de la conversión de SQL

s = rs.getString(1); // or getObject()
if(s == null) {
  // do something else
} else {
  double d = Double.parseDouble(s);
  // do something
}

¿Alguna sugerencia sobre qué camino es mejor, o hay otra forma superior? Y por favor no decir "Uso de hibernación", yo estoy limitado al código JDBC sólo aquí.

¿Fue útil?

Solución

La opción 1 es más cercano:

double d = rs.getDouble(1);
if (rs.wasNull()) {
  // do something
} else {
  // use d
}

No es muy agradable, pero eso es JDBC. Si la columna es nulo, el valor doble se considera "malo", lo que debe comprobar el uso de wasNull() cada vez que se lee un primitivo que es anulable en la base de datos.

Otros consejos

En función de su controlador JDBC y la base de datos, es posible que pueda utilizar un tipo de caja y de reparto:

Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")

Se null si la columna se NULL.

Tenga cuidado de comprobar esto todavía funciona si se cambia la base de datos.

Uso:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()

O con Java 8 se puede hacer esto:

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                .map(BigDecimal::doubleValue).orElse(null));

versión Kotlin para recuperar un campo anulable:

val parentId = resultSet.getObject("parent_id") as Double?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top