IT이야기

Java ResultSet에서 null int 값을 확인하는 중

cyworld 2022. 5. 1. 20:19
반응형

Java ResultSet에서 null int 값을 확인하는 중

Java에서 나는 null 값을 테스트하려고 하고 있는데, 이 열에서 원시 int 유형으로 캐스트되고 있는 ResultSet에서 입니다.

int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
  if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
    iVal = rs.getInt("ID_PARENT");
  }
}

위의 코드 파편을 보면, 이것을 하는 더 좋은 방법이 있는가, 나는 2차 wasNull() 테스트가 중복된다고 가정한다.

우리를 교육하고,

기본값:ResultSet.getInt필드 값이 다음과 같을 때NULL돌아온다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또는 사용하지 않는 경우. 대체-1원하는 null-case 값과 함께.

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 제네릭스로 업데이트만 하면 된다.

이전에 캐스트된 지정된 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 type이 있는 열 이름을 사용하여 이 메서드를 호출할 수 있다.정수 값을 반환하거나 null을 반환한다.데이터베이스의 빈 값에 대해 0이 반환되지 않음

private Integer getIntWithNullCheck(ResultSet rset, String columnName) {
    try {
        Integer value = rset.getInt(columnName);
        return rset.wasNull() ? null : value;
    } catch (Exception e) {
        return null;
    }
}

Java 8을 사용하여 다음을 수행할 수 있다.

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::longValue).orElse(null));

이 경우 SQL 값이 NULL이면 nVal이 0이 아닌 nVal이 되도록 하십시오.

편의를 위해 ResultSet 주위에 wrapper 클래스를 생성하여 null 값을 반환할 때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;
    }

    // ...

}

(나처럼) 코틀린에서 프로그래밍을 하다가 누군가가 여기에 올 경우를 대비해서, 발루스가 제시한 답은 잘 통한다.그냥 알아둬Short그리고Float라고 인스턴스화되다.Integer그리고DoubleResultSet그리고 우리는 전화한 후에 그들을 정확한 타입으로 캐스팅해야 한다.getObject()는 다음과 나의 경우 최종 코드는 다음과 같았다.

when {
    propKClass.isSubclassOf(Int::class) -> rs.getObject(colName) as Int? 
    propKClass.isSubclassOf(Short::class) -> (rs.getObject(colName) as Int?)?.toShort()
    propKClass.isSubclassOf(Long::class) -> rs.getObject(colName) as Long?
    propKClass.isSubclassOf(Boolean::class) -> rs.getObject(colName) as Boolean?
    propKClass.isSubclassOf(Double::class) -> rs.getObject(colName) as Double?
    propKClass.isSubclassOf(Float::class) -> (rs.getObject(colName) as Double?)?.toFloat()
    else -> rs.getString(colName)
}

전화를 거는 대신 다른 방법을 원할 경우ResultSet.wasNull()사용할 수 있다getObject()올바른 유형으로 주조하십시오.

Long val = (Long)rs.getObject(pos++);

또한 에서 null 값을 설정할 수 있다.Statement와 함께setObject().

pstmt.setObject(pos++, 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

반응형