Проверка значения null int из набора результатов Java


в Java я пытаюсь проверить значение null, из результирующего набора, где столбец приводится к примитиву 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 ()

9 228

9 ответов:

по умолчанию 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 не инициализируется)

другое решение:

public class DaoTools {
    static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
        int nValue = rs.getInt(strColName);
        return rs.wasNull() ? null : nValue;
    }
}

Я думаю, это излишне. 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
  }      
}

просто проверьте, если поле null или не использовать ResultSet#getObject(). Заменить -1 С любым значением null-case, которое вы хотите.

int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;

или, если вы можете гарантировать, что используете правильный тип столбца DB, чтобы ResultSet#getObject() действительно возвращает Integer (и таким образом не Long,Short или Byte), то вы также можете просто приведение его в Integer.

Integer foo = (Integer) resultSet.getObject("foo");

AFAIK вы можете просто использовать

iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
  // do somthing interesting to handle this situation
}

даже если он равен нулю.

для удобства, вы можете создать класс-оболочку вокруг ResultSet, который возвращает значение null, когда 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;
    }

    // ...

}

просто обновление с генераторами Java.

вы можете создать служебный метод для извлечения необязательного значения любого типа Java из заданного набора результатов, ранее приведенного.

к сожалению, 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
}

рад получить обратную связь

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

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::longValue).orElse(null));

в этом случае вы гарантируете, что nVal будет null (а не ноль), если значение SQL равно NULL

еще один хороший способ проверки, если у вас есть контроль в SQL, чтобы добавить значение по умолчанию в сам запрос для столбца типа int. Тогда просто проверьте это значение.

например, для базы данных Oracle используйте NVL

SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;

затем проверить

if (rs.getInt('ID_PARENT') != -999)
{
}

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