오라클 NUMBER 형 컬럼의 데이터를 HashMap 타입으로 받아 java에서 사용하려고 할때 오류 발생

java.math.BigDecimal cannot be cast to java.lang.String 


MySQL 의 INT형 컬럼 데이터를 HashMap 타입으로 받아 java에서 사용하려고 할때오류 발생


java.lang.Integer cannot be cast to java.lang.String



iBatis xml 부분
 <SELECT id="selectQue" resultClass="java.util.HashMap" parameterClass="java.util.HashMap"> Query statement </SELECT>

HashMap 으로 결과를 받는 부분
String seq = (String) map.get("SEQ"));



NUMBER(INT) 타입을 곧바로 String으로 캐스트 변환하려고 할때 발생

해결:  캐스트 변환이 아닌, String 클래스의 valueOf (Object) 메소드를 이용해 처리

String seq = String.valueOf(map.get("SEQ"));



'Java > iBatis' 카테고리의 다른 글

[iBatis] Dynamic SQL, iterate  (1) 2010.02.03
[iBATIS] iBatis int 형 데이타 값이 NULL 일때 예외 발생  (1) 2009.12.11
Posted by finewoo
,

iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어
"select * from tableName where idx in ('3','6','9')"
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.

먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.


ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);


그리고 iBatis query.xml 파일에 아래처럼 작성한다.


<select id="getList" parameterClass="idxMap" resultClass="dataVO">
   select * from table
  <dynamic prepend="where">
    <isNotEmpty prepend="and" property="idxArr">
      <iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
        #idxArr[]#
      </iterate>
    </isNotEmpty>
  </dynamic>
</select>


그러면 iBatis에서 내부적으로
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.


$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다.





Posted by finewoo
,

iBatis로 데이터베이스 테이블의 int형 컬럼값을 가져올때
컬럼의 값이 NULL이거나 값이 없을 경우 예외가 발생하게 된다.
char형 컬럼은 상관이 없다.

이런 현상은 int가 객체가 아니기 때문에 매핑시 에러가 발생하게 된다고 한다.
이 오류를 해결하기 위해서 물론 쿼리에서 null일경우 0으로 치환할 수는 있다.
하지만, 개인적인 생각으로는 null과 0은 분명히 다른 값이므로 임의로 null을 쿼리에서 0으로 변환하는 것은 그닥 추천할 만한 방법은 아닌듯 싶다.

그래서, 테이블 생성할때 컬럼속성이 int형인 경우는 테이블 생성시 제약조건에서 디폴트 값을 0 또는 다른 값으로 미리 지정하는 방법이 나을 것 같다.




'Java > iBatis' 카테고리의 다른 글

[iBatis] NUMBER(INT) 타입 컬럼 처리 시 cast 오류 발생  (1) 2011.03.29
[iBatis] Dynamic SQL, iterate  (1) 2010.02.03
Posted by finewoo
,