[java] 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")반환해야합니다 . 따라서 다음과 같은 작업을 수행하는 것이 가능해야합니다.IntegernullNULL

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, ShortByte), 당신이 할 수도 그냥 배역에 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;
    }
}