Java ResultSet에서 널 int 값 확인
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
원하는 null 값으로 대체하십시오 .
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
}
피드백 받기
Java 8을 사용하면 다음을 수행 할 수 있습니다.
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::longValue).orElse(null));
이 경우 SQL 값이 NULL 인 경우 nVal이 널 (0이 아님)이되도록합니다.
편의를 위해 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;
}
// ...
}
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;
}
}
SQL을 제어하는 경우 확인하는 또 다른 좋은 방법은 int 열의 쿼리 자체에 기본값을 추가하는 것입니다. 그런 다음 해당 값을 확인하십시오.
예를 들어 Oracle 데이터베이스의 경우 NVL을 사용하십시오.
SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
그런 다음 확인
if (rs.getInt('ID_PARENT') != -999)
{
}
물론 이것은 일반적으로 열에서 찾을 수없는 값이 있다고 가정합니다.
참고 URL : https://stackoverflow.com/questions/2920364/checking-for-a-null-int-value-from-a-java-resultset
'IT' 카테고리의 다른 글
$ str [0]으로 문자열의 첫 문자 얻기 (0) | 2020.03.30 |
---|---|
MS 배치 파일을 사용하여 프로그램 출력을 변수에 지정 (0) | 2020.03.30 |
C의 printf에서 % (퍼센트) 기호를 이스케이프 처리하는 방법은 무엇입니까? (0) | 2020.03.30 |
ASP.NET MVC 3 Razor와 함께 Ajax.BeginForm 사용 (0) | 2020.03.30 |
"docker run -d"후에 Docker 컨테이너가 자동으로 중지됩니다 (0) | 2020.03.30 |