com.ibatis.common.jdbc.exception.NestedSQLException
쿼리문에서
parameterClass="str" 를
parameterClass="hashmap"으로 바꾸니까 해결!
iBatis 에러이지만.. sql을 수정하면 될 것도 같고..
뭔소린지 모르겠고.. 일단.. 자주 나는 에러라고 하니
다음을 대비해서 저장.
http://danji1126.tistory.com/105
iBatis
Spring 구조로 개발하다 보면 아래와 같은 오류를 볼수가 있다.
대부분의
경우가 DB 타입과 해당 모델(resultMap) 의 타입이 맞지 않아 나는 오류이다.
iBatis를 사용할 때 발생하는 Exception입니다. 뭐~ 워낙 많이 발생하는 Exception이고, 경우의 수도 많습니다. |
DB에 데이터를 넣고 빼는 간단한 부분이 있다. 필드가 일부 추가돼서 테이블 스키마를 변경했는데 iBatis를 통해서 읽어오는 데이터를 매핑하지 못 하는 현상이 발생했다. 이 정도면 알아서 해줄줄 알았는데 안 되네..
http://entireboy.egloos.com/4707109
SELECT *
FROM catalog_query
어쩌구 저쩌구
</select>
기존에 사용하던 resultMap이다.
<result property="code" />
<result property="pk" />
<result property="query" />
<result property="csvInclude" column="include" />
</resultMap>
기존 MySQL 테이블은 이렇게 생겼다.
`code` varchar(5) NOT NULL,
`pk` varchar(20) NOT NULL,
`query` varchar(200) NOT NULL,
`include` varchar(1000) DEFAULT NULL,
어쩌구 저쩌구
`code` varchar(5) NOT NULL,
`pk` varchar(20) NOT NULL,
`query` varchar(200) NOT NULL,
`include` varchar(1000) DEFAULT NULL,
`include_path` varchar(1000) DEFAULT NULL,
어쩌구 저쩌구
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in ibatis/sql/query.xml.
--- The error occurred while applying a result map.
--- Check the query.csvQueryResult.
--- The error happened while setting a property on the result object.
--- Cause: net.sf.cglib.beans.BulkBeanException
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:204)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithRowHandler(MappedStatement.java:149)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryWithRowHandler(SqlMapExecutorDelegate.java:601)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryWithRowHandler(SqlMapSessionImpl.java:156)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryWithRowHandler(SqlMapClientImpl.java:132)
at test.MysqlTest.loadAllData(MysqlTest.java:70)
Caused by: net.sf.cglib.beans.BulkBeanException
at test.MysqlTest$$BulkBeanByCGLIB$$22ece2b4.setPropertyValues(<generated>)
at com.ibatis.sqlmap.engine.accessplan.EnhancedPropertyAccessPlan.setProperties(EnhancedPropertyAccessPlan.java:33)
at com.ibatis.sqlmap.engine.exchange.JavaBeanDataExchange.setData(JavaBeanDataExchange.java:112)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.setResultObjectValues(ResultMap.java:371)
at com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java:64)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:385)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:300)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:189)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
... 6 more
Caused by: java.lang.NullPointerException
... 16 more
<result property="code" column="code" />
<result property="pk" column="pk" />
<result property="query" column="query" />
<result property="csvInclude" column="include" />
</resultMap>
<result property="code" />
<result property="pk" />
<result property="query" />
<result property="csvInclude" column="include" />
<result property="csvIncludePath" column="include_path" />
</resultMap>
"SELECT *"을 쓰는 경우는 2번 보다는 1번 방법이 더 좋을 것 같다. 언제 column이 변경될지 모르니.. 변경될 때 마다 찾아서 바꿔주는 것도 귀찮고..
iBATIS 동적 쿼리 수행 시 AutoResultMap 에러
문제:
현업이 종종 특정 데이터를 엑셀로 뽑아달라는 요청을 합니다.
요청이 간헐적이고 같은 데이터를 시도 때도 없이 새로 뽑아달라는 요청을 해서,
좀 효율적으로 처리하고자 동적 쿼리를 수행하는 메뉴를 하나 만들었습니다.
해당 쿼리가 자주 변하고 보안 문제도 있었기 때문에,
관리를 편하게 하기 위해 DB 대신 파일 기반으로 설계했습니다.
서버에 올라가 있는 sql 파일을 읽어 목록을 구성하고,
해당 쿼리를 담은 sql 파일을 읽어 엑셀로 다운로드 받을 수 있는 기능입니다.
(우리는 요청 쿼리를 담은 sql 파일을 서버에 올리기만 하면 되도록 말이죠.)
iBATIS 를 사용하고 있어 파일에서 읽은 쿼리를 아래와 같이 $sql$ 형태로 전달하도록 했는데,
<select id="dynamicQuery" resultClass="hashmap">
$sql$
</select>
첫 번째는 정상적으로 실행되고, 그 이후 다른 쿼리를 다운로드 받으려 시도했을 때
아래와 같은 에러가 발생합니다.
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a result map.
--- Check the 쿼리ID - AutoResultMap.
--- Check the result mapping for the 컬럼명 property.
--- Cause: java.sql.SQLException: 부적합한 열 이름
문제가 뭘까요...
해결책:
iBATIS 는 기본적으로 해당 쿼리에 대한 메타데이터(필드, 타입 등)를 캐시한다고 합니다.
따라서 위 dynamicQuery 구문이 실행된 이후 그 결과의 컬럼 정보가 캐시되었고,
이후 다른 컬럼 정보를 포함한 쿼리가 dynamicQuery 로 실행되었을 때
캐시된 컬럼 정보로 값을 찾으려하다 오류가 난 거였던 거죠.
이 경우엔, 아래와 같이 해당 select 구문의 메타데이터를 캐시하지 않도록 설정하면 된다고 합니다.
<select id="dynamicQuery" resultClass="hashmap" remapResults="true">
$sql$
</select>
아래 포스트에서 참고했습니다.
아이바티스(iBATIS)에서 동적 쿼리
iBatis에서 AutoResultMap Error 해결방법