┃└ STRUTS-IBATIS

ibatis에서 select 할때 결과가 null인 데이터의 처리 방법

프로필

2008. 2. 14. 15:46

이웃추가

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