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

사용된 iBatis 문




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


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

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

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


작게나마 도움 되시길~ ^^
Posted by hyshin


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 이라고 붙여줌으로써 해결할 수 있습니다.

 


	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
	)

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


	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

	

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

Posted by hyshin
TAG iBatis, Oracle

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
Posted by hyshin
TAG iBatis