Проверка значения 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 ответов:
по умолчанию
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) { }
конечно, это также в предположении, что есть значение, которое обычно не было бы найдено в столбце.