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
그리고Double
ResultSet
그리고 우리는 전화한 후에 그들을 정확한 타입으로 캐스팅해야 한다.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
'IT이야기' 카테고리의 다른 글
Vuex getter가 정의되지 않은 상태로 반환됨 (0) | 2022.05.02 |
---|---|
IE 11에서 코드 블록 루핑 (0) | 2022.05.01 |
VueJS(vuex)에서 온디맨드 방식으로 데이터 가져오기 (0) | 2022.05.01 |
사용자 지정 테마 추가 방법 확인 (0) | 2022.04.29 |
메이븐이 JDK 1.6을 사용하는 이유 그러나 내 자바버전은 1.7이다. (0) | 2022.04.29 |