Проверка значения 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)
{
}

Конечно, это также предполагается в предположении, что есть значение, которое обычно не будет найдено в столбце.