Как мне в JDBC прочитать возможное нулевое двойное значение из resultSet?

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

  •  12-09-2019
  •  | 
  •  

Вопрос

У меня есть столбец в моей базе данных, который набран double и я хочу прочитать значение из него, используя JDBC ResultSet, но оно может быть нулевым.Как лучше всего это сделать?Я могу придумать три варианта, ни один из которых не кажется мне очень хорошим.

Опция 1:Плохо, потому что обработка исключений многословна и вонючая.

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

Вариант 2:Плохо, потому что две выборки

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

Вариант 3:Плохо, потому что преобразование Java, а не SQL.

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

Есть какие-нибудь предложения о том, какой способ лучше или есть ли другой лучший способ?И, пожалуйста, не говорите «Использовать Hibernate», здесь я ограничен только кодом JDBC.

Это было полезно?

Решение

Вариант 1 наиболее близок:

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

Это не очень приятно, но это JDBC.Если столбец был нулевым, двойное значение считается «плохим», поэтому вам следует проверить его с помощью wasNull() каждый раз, когда вы читаете примитив, который в базе данных имеет значение NULL.

Другие советы

В зависимости от вашего драйвера JDBC и базы данных вы можете использовать коробочный тип и приведение:

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

Это будет null если столбец был NULL.

Будьте осторожны и проверьте, что это по-прежнему работает, если вы измените базу данных.

Использовать:

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

Или с помощью Java 8 вы можете сделать это:

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

Версия Kotlin для получения поля, допускающего значение NULL:

val parentId = resultSet.getObject("parent_id") as Double?
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top