Проверка значения null int из Java ResultSet
В Java я пытаюсь проверить нулевое значение, из ResultSet, где столбец приводится к примитивному типу int.
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
Из фрагмента кода выше, есть ли лучший способ сделать это, и я предполагаю, что второй тест wasNull() является избыточным?
Просветите нас и спасибо
Ответы
Ответ 1
По умолчанию для ResultSet.getInt
, когда значение поля NULL
возвращает 0
, что также является значением по умолчанию для вашего объявления iVal
. В этом случае ваш тест полностью избыточен.
Если вы действительно хотите сделать что-то другое, если значение поля NULL, я предлагаю:
int iVal = 0;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// handle NULL field value
}
}
(Отредактировано как комментарии @martin ниже, код OP, как написано, не будет компилироваться, потому что iVal
не инициализирован)
Ответ 2
Другое решение:
public class DaoTools {
static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
int nValue = rs.getInt(strColName);
return rs.wasNull() ? null : nValue;
}
}
Ответ 3
Я думаю, он лишний. rs.getObject("ID_PARENT")
должен возвращать объект Integer
или null
, если значение столбца на самом деле было null
. Поэтому даже можно сделать что-то вроде:
if (rs.next()) {
Integer idParent = (Integer) rs.getObject("ID_PARENT");
if (idParent != null) {
iVal = idParent; // works for Java 1.5+
} else {
// handle this case
}
}
Ответ 4
Просто проверьте, нет ли поля null
или не используется ResultSet#getObject()
. Замените -1
на любое нулевое значение, которое вы хотите.
int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;
Или, если вы можете гарантировать, что используете правильный тип столбца DB, чтобы ResultSet#getObject()
действительно возвращал Integer
(и, следовательно, не Long
, Short
или Byte
), тогда вы также можете просто приведите его к Integer
.
Integer foo = (Integer) resultSet.getObject("foo");
Ответ 5
AFAIK вы можете просто использовать
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// do somthing interesting to handle this situation
}
даже если он равен NULL.
Ответ 6
Для удобства вы можете создать класс оболочки вокруг ResultSet, который возвращает нулевые значения, если ResultSet
обычно не будет.
public final class ResultSetWrapper {
private final ResultSet rs;
public ResultSetWrapper(ResultSet rs) {
this.rs = rs;
}
public ResultSet getResultSet() {
return rs;
}
public Boolean getBoolean(String label) throws SQLException {
final boolean b = rs.getBoolean(label);
if (rs.wasNull()) {
return null;
}
return b;
}
public Byte getByte(String label) throws SQLException {
final byte b = rs.getByte(label);
if (rs.wasNull()) {
return null;
}
return b;
}
// ...
}
Ответ 7
Просто обновление с помощью Java Generics.
Вы можете создать метод утилиты для получения необязательного значения любого типа Java из заданного ResultSet, ранее выполненного.
К сожалению, getObject (columnName, Class) не возвращает значение null, но значение по умолчанию для данного типа Java, поэтому требуется 2 вызова
public <T> T getOptionalValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException {
final T value = rs.getObject(columnName, clazz);
return rs.wasNull() ? null : value;
}
В этом примере ваш код может выглядеть следующим образом:
final Integer columnValue = getOptionalValue(rs, Integer.class);
if (columnValue == null) {
//null handling
} else {
//use int value of columnValue with autoboxing
}
Счастлив получить обратную связь
Ответ 8
С помощью java 8 вы можете сделать это:
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::longValue).orElse(null));
В этом случае вы убедитесь, что nVal будет null (а не нолем), если значение SQL равно NULL
Ответ 9
Еще один хороший способ проверки, если вы контролируете SQL, заключается в том, чтобы добавить значение по умолчанию в самом запросе для столбца int. Затем просто проверьте это значение.
например, для базы данных Oracle, используйте NVL
SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
затем проверьте
if (rs.getInt('ID_PARENT') != -999)
{
}
Конечно, это также предполагается в предположении, что есть значение, которое обычно не будет найдено в столбце.