ibatis를 통하여 데이터를 쿼리 해올때 쿼리해 온 결과가 null값인 경우 에러가 발생한다.
이러한 에러를 처리해 주기 위해서..!!
방법상 resultMap을 이용하는게 편리하지 않을까 싶다..
1. resultMap을 이용
<resultMap id="rtnBoardList-Map" class="java.util.HashMap"> <result property="boardno" column = "boardno"/> <result property="title" column = "title"/> <result property="contents" column = "contents"/> <result property="register" column = "register" nullValue="nulltest" />
<result property="inttest" column = "inttest" nullValue="0" /> </resultMap>
<select id="getBoard" parameterClass="Map" resultClass="board.BoardBean"> SELECT BOARDNO, TITLE, CONTENTS, REGISTER, HITCNT, INTTEST
FROM BOARD WHERE BOARDNO = #boardno# AND TITLE = #title# </select>
<select id="getBoardList" resultMap="rtnBoardList-Map"> SELECT BOARDNO, TITLE, CONTENTS, REGISTER, INTTEST FROM BOARD ORDER BY BOARDNO DESC </select> |
2. Beans 파일에 조건 주기
public class BoardBean {
private String hitcnt = null; private int inttest = 0;
public String getRegister() { return register; } public void setRegister(String register) { if( register == null ) register = "nulltest"; this.register = register; } public int getInttest() { return inttest; } public void setInttest(String inttest) { int tmpInttest = 0; try { tmpInttest = Integer.parseInt(inttest); }catch(Exception ex){} this.inttest = tmpInttest; }
}
} |
==========================================================================================================================
참고자료 :
SELECT 할때 컬럼이 number타입인 경우 데이타가 NULL인 경우 에러 메시지를 첨부합니다..
제 생각엔 entity.java에서 get, set할때 나는듯 합니다..
string인 경우는 에러가 안생기는데..
참고로 nvl(컬럼,0)하면 에러 발생은 안하지만 데이타가 실제로 0인지, 없는것인지 구분이 안되어서 해결책은 아닌듯 싶습니다..
다음은 제 고객님께서 iBatis 관련해서 문의하신 내용입니다. 테이블의 숫자형 컬럼에 null 이 들어 있는 경우 이를 객체의 속성으로 받아올 때 에러가 난다는 것이죠. 얼핏 생각하면 당연히 결과가 나와야 하는데 java.lang.IllegalArgumentException 이 발생합니다.
그 이유는 아래 한 문장으로 요약할 수 있습니다.
int a = null;
위 문장은 에러가 납니다. 오직 객체만이 null 값을 가질 수 있는 것이죠.
결과적으로 DB에 null 값이 있다면 이를 int 로 변환할 때 IllegalArgumentException 이 발생하죠.
ibatis에선 이러한 문제 해결을 위해서 <resultMap> 엘리먼트의 하위 <result> 엘리먼트에서 nullValue 속성으로 문제를 해결할 수 있습니다.
<resultMap id="entityResult" class="entity">
<result property="intval" column="intval" nullValue="-9999" />
...
</resultMap>
null 을 0 으로 할 수도 있지만, null 을 정해지지 않았다는 의미로 사용하실 때는 -99999 와 같이 일반적으로 사용할 값의 범위외의 특수한 값으로 지정하기도 하죠.
그런데.. 이걸 원한게 아니라고 하심..^^;
값이 없는 것은 공백이나 null 이 되길 원한다고 하네요.
이럴 땐... 문제의 본질에 초점을 맞추면 생각보다 쉽게 해결되더군요.
문제의 근원은 primitive는 객체가 아니라 null 을 할당할 수 없단 것이다.
그럼.. primitive를 객체로 바꿔주면 된다.
단순히 도메인 객체의 타입만 primitive의 Wrapper로 바꿔서 문제를 해결할 수 있었다. 그리고, 위의 nullValue는 지워줘야 한다.
public class Entity {
private Integer intval;
private Float floatval;
public Integer getIntval() {
return intval;
}
public void setIntval(Integer intval) {
this.intval = intval;
}
public Float getFloatval() {
return floatval;
}
public void setFloatval(Float floatval) {
this.floatval = floatval;
}
}
출처 : http://cafe.naver.com/1100100101.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=400