Java에서 열이 기본 int 유형 으로 캐스트되는 ResultSet에서 null 값을 테스트하려고 합니다.
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
위의 코드 조각 에서이 작업을 수행하는 더 좋은 방법이 있습니까? 두 번째 wasNull () 테스트가 중복 이라고 가정합니다 .
우리를 교육하고 감사합니다
답변
ResultSet.getInt
필드 값 이로 설정 될 때 의 기본값 NULL
은 return 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
원하는 널값으로 대체하십시오 .
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
}
NULL 인 경우에도 마찬가지입니다.
답변
Java Generics로만 업데이트하십시오.
이전에 캐스트 된 지정된 ResultSet에서 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
}
피드백 받기
답변
resultSet 및 Number 유형의 열 이름을 사용하여이 메소드를 호출 할 수 있습니다. Integer 값을 리턴하거나 널을 리턴합니다. 데이터베이스에서 빈 값으로 0이 리턴되지 않습니다.
private Integer getIntWithNullCheck(ResultSet rset, String columnName) {
try {
Integer value = rset.getInt(columnName);
return rset.wasNull() ? null : value;
} catch (Exception e) {
return null;
}
}