오라클 NUMBER 형 컬럼의 데이터를 HashMap 타입으로 받아
java에서 사용하려고 하니
java.math.BigDecimal cannot be cast to java.lang.String  오류가 발생하더군요.

사용된 iBatis 문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<select id="SQL-VIEW" parameterClass="java.util.Map" resultClass="java.util.HashMap">
SELECT
    ID
    ,COMMUNITY_ID
    ,TITLE
    ,TYPE_CODE
    ,LIST_ORDER
    ,PAGE_SIZE
    ,HYPERLINK_URL
    ,AUTH_WRITE
    ,AUTH_READ
    ,IS_OPEN
    ,TO_CHAR(REG_DATE, 'YYYY.MM.DD HH24:MI') REG_DATE
    ,TO_CHAR(UPT_DATE, 'YYYY.MM.DD HH24:MI') UPT_DATE
    FROM COMMUNITY_MENUS
WHERE
    ID = #menuID#
    AND IS_DELETE = 'N'
</select>
cs


오류가 발생한 java 문
String pageSize = (String) mnuMap.get("PAGE_SIZE"));


NUMBER 타입을 곧바로 String으로 캐스트 변환하려고 하니 생기는 문제였습니다.

캐스트 변환을 하지 않고,
String 클래스의 valueOf (Object) 메소드를 이용해 처리하면
문제 해결할 수 있습니다.

수정된 java 문
String pageSize = String.valueOf(mnuMap.get("PAGE_SIZE"));


작게나마 도움 되시길~ ^^



  1. 김웅진 2011.05.10 10:04

    크게 도움이 되었습니다. int 변환 후 다시 String변환 처리도 안먹혀서 고민하고 있었는데 왜 이걸 생각하지 못했나

    자책이 들 정도로 한방에 해결 되었습니다. ^_^

    • hyshin 2011.05.24 13:18 신고

      도움 되셨다니 다행입니다.. 좋은 하루 되세요 ^^

  2. 이홍주 2011.05.25 11:30

    완전 감사합니다.~~ 캬캬캬
    하나 배우고 가네요~

    • hyshin 2011.06.03 15:03 신고

      ㅎㅎ 댓글 감사합니다 ^^ 도움 되셨길 바랍니다 ^^


JDK 1.5_22 + Spring 2.5.6 + iBatis 2.3.4 + Oracle 10g

요즘 Spring MVC 이용해 개발을 계속 하고 있는데,
iBatis에서 parameterClass와 resultClass를
DTO 선언 없이, HashMap 만으로 이용해서 만들고 있습니다.

그런데 CLOB은 정상적으로 값이 넘어가지 않는 오류가 발생하더군요.

오라클 9i 에서는 Clob type handler 를 별도 선언해서 사용하기도 한다고 하는데
10g에서는 곧바로 사용할 수 있다고 합니다.

항상 DTO 써서 개발하다가 이번에 없이 하려다 보니
예상치 못한 데서 문제가... ^^;;

제가 해결한 소스 올려 봅니다.

먼저 insert, update 와 같은 Manipulation 작업에서는 ..
해당 파라미터 뒤에 :CLOB 이라고 붙여줌으로써 해결할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<insert id="SQL-INSERT" parameterClass="java.util.Map">
    INSERT INTO COMMUNITY_BBS (
        ID
        ,MENU_ID
        ,COMMUNITY_ID
        ,ROW_GROUP
        ,ROW_POSITION
        ,ROW_DEPTH
        ,TITLE
        ,CONTENTS
        ,USER_ID
        ,NICKNAME
        ,IS_NOTICE
        ,REG_DATE    
    ) VALUES (
        #bbsID#
        ,#menuID#
        ,#communityID#
        ,#bbsID#
        ,1
        ,1
        ,#title#
        ,#contents:CLOB#
        ,#userID#
        ,#nickname#
        ,#isNotice#
        ,SYSDATE
    )
</insert>
cs

 

그리고 select 와 같은 retrieve 구문에서는
resultMap 을 하나 선언한 뒤 사용하면 해결됩니다.
(resultClass를 곧바로 사용할 경우, CLOB의 주소값이 넘어오더군요..)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<resultMap id="ResMap" class="java.util.HashMap">
    <result property="ID"/>
    <result property="MENU_ID"/>
    <result property="COMMUNITY_ID"/>
    <result property="ROW_GROUP"/>
    <result property="ROW_POSITION"/>
    <result property="ROW_DEPTH"/>
    <result property="TITLE"/>
    <result property="CONTENTS" javaType="java.lang.String" jdbcType="CLOB"/>
    <result property="USER_ID"/>
    <result property="NICKNAME"/>
    <result property="HIT_COUNT"/>
    <result property="RECOMMEND_COUNT"/>
    <result property="COMMENT_COUNT"/>
    <result property="IS_NOTICE"/>
    <result property="REG_DATE"/>
    <result property="UPT_DATE"/>
</resultMap>
    <select id="SQL-VIEW" parameterClass="java.util.Map" resultMap="ResMap">
        SELECT
            ID
            ,MENU_ID
            ,COMMUNITY_ID
            ,ROW_GROUP
            ,ROW_POSITION
            ,ROW_DEPTH
            ,TITLE
            ,CONTENTS
            ,USER_ID
            ,NICKNAME
            ,HIT_COUNT
            ,RECOMMEND_COUNT
            ,COMMENT_COUNT
            ,IS_NOTICE
            ,TO_CHAR(REG_DATE, 'YYYY/MM/DD HH24:MI') REG_DATE
            ,TO_CHAR(UPT_DATE, 'YYYY/MM/DD HH24:MI') UPT_DATE
        FROM HER_COMMUNITY_BBS
        WHERE
            ID = #bbsID#
            AND IS_DELETE = 'N'
    </select>
cs

생각보다 훨씬 간단했는데...
이걸 못 찾아서... 만 하루동안 삽질을.... ^^;;

  1. 두이 2015.01.06 16:42

    감사히 담아갑니다 :)

    • hyshin 2015.01.23 15:05 신고

      댓글 감사합니다~ 작게나마 도움 되셨길 합니다

  2. shamm 2016.06.03 16:06

    감사합니다 검색해도 잘안나오는 편리한팁~ ㅋ

    • hyshin 2016.08.17 14:40 신고

      도움 되셨다니 저도 감사합니다 ^^ 오늘도 좋은 하루 되세요~


Spring 2.5 + iBatis 작업 중
select 결과를 저장하기 위해 다음과 같이 작성했습니다.

<select id="SQL-LIST" parameterClass="java.util.Map" resultClass="java.util.Map">
SELECT ...
</select> 

그렇게 하니
다음의 에러가 발생하더군요.

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];  
--- The error occurred in /sql/CommunityMDAO.xml. 
--- The error occurred while applying a result map. 
--- Check the Community.SQL-LIST-AutoResultMap. 
--- Check the result mapping for the 'UPT_DATE' property. 
--- Cause: java.lang.RuntimeException: JavaBeansDataExchange could not instantiate result class.  Cause: java.lang.InstantiationException: java.util.Map; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in /sql/CommunityMDAO.xml. 
--- The error occurred while applying a result map. 
--- Check the Community.SQL-LIST-AutoResultMap. 
--- Check the result mapping for the 'UPT_DATE' property. 
--- Cause: java.lang.RuntimeException: JavaBeansDataExchange could not instantiate result class.  Cause: java.lang.InstantiationException: java.util.Map

java의 Map의 경우 interface 이다 보니
초기화에 실패하는 문제가 발생하더군요..

parameterClass 의 경우에는
인터페이스로 선언만 하면 전달인자에 의해서 자동으로 변환이 되지만,
resultClass 는 실존하는 형태로 제공이 되어야만 초기화가 가능한 것 같습니다.

그래서 다음과 같이 수정했습니다.

<select id="SQL-LIST" parameterClass="java.util.Map" resultClass="java.util.HashMap">
SELECT ...
</select>

이렇게 수정하고 나니
해결이 문제 없이 표기 되더군요..

별도의 DTO 생성 없이 하려다 보니
이런 문제가 생겼네요...

이거 때문에 2시간은 그냥 보낸 듯... ^^;;

참고:
http://blog.daum.net/_blog/BlogTypeView.do?blogid=09j4R&articleno=17200835#ajax_history_home

+ Recent posts