В 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 () является избыточным?
Просветите нас и спасибо
IF(colName = NULL, 0, colName) AS colName
вSELECT
заявлении (предпочтительно в хранимая процедура). С философской точки зрения это сводится к тому, должна ли БД соответствовать приложению или наоборот. Поскольку SQL легко обрабатывает значения NULL, а многие потребители SQL этого не делают (то естьjava.sql.ResultSet
), я по возможности использую его в БД. (Это, конечно, предполагает, что концептуально NULL и ноль эквивалентны для ваших целей.)Ответы:
Значение по умолчанию для
ResultSet.getInt
поляNULL
должна возвращаться0
, что также является значением по умолчанию для вашегоiVal
объявления. В этом случае ваш тест полностью избыточен.Если вы действительно хотите сделать что-то другое, если значение поля NULL, я предлагаю:
(Отредактировано как комментарии @martin ниже; написанный OP-код не будет компилироваться, поскольку
iVal
не инициализирован)источник
getInt()
должно быть,getInteger()
которое возвращает,Integer
что,null
если значение БДnull
. Разработчики действительно испортили это.0
иNULL
это две большие разные вещиДругое решение:
источник
Я думаю, это излишне.
rs.getObject("ID_PARENT")
должен вернутьInteger
объект илиnull
, если значение столбца действительно былоNULL
. Так что должно быть даже возможно сделать что-то вроде:источник
getObject
не обязательно возвращает целое число, из-за природы типа столбца в оракуле, который я использую («Число»).Types.BIGINT
(что должно быть сопоставлено с aLong
)getObject()
метод возвращает 0 вместо нуля.rs.getObject("ID_PARENT", Integer.class)
Просто проверьте, используется ли поле
null
или нетResultSet#getObject()
. Замените-1
на любое значение с нулевым регистром, которое вы хотите.Или, если вы можете гарантировать, что используете правильный тип столбца БД, так что он
ResultSet#getObject()
действительно возвращаетInteger
(и, следовательно, нетLong
,Short
илиByte
), то вы также можете просто привести его к типуInteger
.источник
AFAIK вы можете просто использовать
даже если это NULL.
источник
Просто обновление с использованием Java Generics.
Вы можете создать служебный метод для извлечения необязательного значения любого типа Java из заданного ResultSet, ранее приведенного.
К сожалению, getObject (columnName, Class) не возвращает ноль, но значение по умолчанию для данного типа Java, поэтому требуется 2 вызова
В этом примере ваш код может выглядеть следующим образом:
Рад получить обратную связь
источник
Вы можете вызвать этот метод, используя resultSet и имя столбца с типом Number. Он либо возвратит целочисленное значение, либо ноль. Там не будет нулей, возвращаемых для пустого значения в базе данных
источник
С Java 8 вы можете сделать это:
В этом случае вы гарантируете, что nVal будет нулевым (а не нулевым), если значение SQL равно NULL
источник
resultSet.getInt("col_name")
if (rs.wasNull())
Для удобства вы можете создать класс-оболочку вокруг ResultSet, который возвращает нулевые значения, когда
ResultSet
обычно этого не происходит.источник
Еще один хороший способ проверить, если у вас есть контроль над SQL, это добавить значение по умолчанию в самом запросе для вашего столбца int. Тогда просто проверьте это значение.
например, для базы данных Oracle, используйте NVL
затем проверьте
Конечно, это также при условии, что есть значение, которое обычно не будет найдено в столбце.
источник