IT

Java ResultSet에서 널 int 값 확인

lottoking 2020. 3. 30. 08:55
반응형

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원하는 null 값으로 대체하십시오 .

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
}

피드백 받기


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

반응형