부적합한 열이름(동적으로 컬럼명 사용할 시 )

개발/DB 2020. 11. 30. 17:04

티베로 DB를 사용 하던 도중

JDBC-90611:ERRJD 해당 에러를 확인했다.

쿼리도 이상없고, 소스도 이상없는것 같아서 한참동안 헤메다가 원인을 발견했다.

 

ibatis를 사용하는 경우 동적으로 table name과 column name을 생성하여
쿼리를 실행해야 하는 경우가 발생한다.

예를 들면 다음과 같다.
<select id="fileInfo"  resultClass="java.lang.String" parameterClass="java.util.Map">
    SELECT $columnName$
      FROM $tableName$
    WHERE $pkName$ = #pkValue#
</select>

전혀 이상없는 구문이나 실행시 에러가 발생한다.
이상하게도 처음 실행시에는 에러가 발생하지 않으나,
두번째 부터 에러가 발생하기 시작한다.

WAS를 재기동하면 또 첫번째는 이상없으나, 두번째 부터 에러가 발생한다.


ibatis는 특정 id의 쿼리를 실행 한 후 해당 id의 쿼리를
캐쉬로 보관하고 있다가
동일한 id에 대한 요청시 캐쉬에 저장된 쿼리정보를 토대로 result값을 맵핑 시킨다고 한다.
(ibatis에서 제공하는 CacheModel과는 전혀무관한 얘기임)

이를 해결하기 위해선 remapResults="true" 속성을 추가해 주면 된다.
default remapResults="false" 이기때문에 항상 요청된 id와 동일한게
캐쉬에 저장되어 있다면 캐쉬의 내용으로 맵핑하려 할것이고
에러가 날것이다. 위 속성을 true로 지정하면
캐쉬의 내용을 무시하고 현재의 값을 가지고 맵핑시킴.

즉 아래와 같이 사용하면 된다.
<select id="fileInfo" remapResults="true"  resultClass="java.lang.String" parameterClass="java.util.Map">
    SELECT $columnName$
      FROM $tableName$
    WHERE $pkName$ = #pkValue#
</select>


출처: https://jace.tistory.com/57 [Jace's Blog]

'개발 > DB' 카테고리의 다른 글

MySQL database, data 복사하기  (0) 2020.03.25
Clob 타입을 varchar2 타입으로  (0) 2018.02.14
오라클 REGEXP_LIKE  (0) 2015.12.16
ORA-00054 에러  (0) 2015.11.25
해당 컬럼이 있는 테이블 찾기  (0) 2015.09.14