Как мне прочитать в JDBC возможно нулевое двойное значение из resultSet? - PullRequest
33 голосов
/ 09 июля 2009

В моей базе данных есть столбец с типом 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 только здесь.

Ответы [ 5 ]

51 голосов
/ 09 июля 2009

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

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

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

15 голосов
/ 12 декабря 2012

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

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

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

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

4 голосов
/ 07 июля 2016

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

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                .map(BigDecimal::doubleValue).orElse(null));
4 голосов
/ 02 марта 2014

Использование:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
0 голосов
/ 30 апреля 2019

версия Kotlin для извлечения обнуляемого поля:

val parentId = resultSet.getObject("parent_id") as Double?
...