Как я в JDBC читаю, возможно, нулевое двойное значение из resultSet?
У меня есть столбец в моей базе данных, набираемый double
, и я хочу прочитать значение из него с помощью JDBC ResultSet, но оно может быть нулевым. Каков наилучший способ сделать это? Я могу думать о трех вариантах, ни один из которых не кажется очень хорошим.
Вариант 1: Плохо, потому что обработка исключений verbose и вонючий
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
Вариант 1 ближайший:
double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
Это не очень приятно, но это JDBC. Если столбец был нулевым, двойное значение считается "плохой", поэтому вы должны проверять с помощью wasNull()
каждый раз, когда вы читаете примитив, который может быть нулевым в базе данных.
Ответ 2
В зависимости от вашего драйвера JDBC и базы данных вы можете использовать тип и тип коробки:
Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
Это будет null
, если столбец был null
.
Будьте осторожны, чтобы проверить, что это все еще работает, если вы меняете базу данных.
Ответ 3
Использование:
rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
Ответ 4
Или с помощью java 8 вы можете сделать это:
Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
Ответ 5
Версия Kotlin для извлечения обнуляемого поля:
val parentId = resultSet.getObject("parent_id") as Double?