Вопрос по java, jdbc, null, double – Как мне в JDBC прочитать возможно нулевое двойное значение из resultSet?

30

У меня есть столбец в моей базе данных, который напечатан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 здесь.

Ваш Ответ

4   ответа
3

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

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

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

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

О, мой бог. Спасибо хоть
У меня была та же самая реакция, что и у @JosefPfleger, когда я понял, как работает vanilla JDBC в отношении нулей. Если вы хотите продолжить использовать простой SQL (в отличие от принятия ORM) и вообще избежать этой катастрофы, я предлагаю использовать SpringJdbcTemplate, который заботится обо всех этих досадных пустых проверках для вас.
обратите внимание, что при извлечении нулевых примитивов из набора результатов отсутствует sqlexception. в таких случаях возвращается значение по умолчанию для этого примитива (0 для int, 0.0 для double и т. д ....). Следовательно, почему .wasNull () - неизбежное зло.
14

вы можете использовать упакованный тип и приведение:

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

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

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

Это не работает для меня при запросе HSQLDB с синтаксисом оракула для тестов.
Это хорошо сработало для меня для MySQL, и приятнее на глазах, чем .wasNull ()
также не работает на Oracle XE.

Похожие вопросы