Programing/Spring

ibatis # $차이 동적 테이블, 동적 컬럼을 사용해보자.

리커니 2016. 7. 6. 11:20
반응형

 

ibatis # $차이 동적 테이블, 동적 컬럼을 사용해보자.

 

개발을 하다보면 같은 쿼리문인데 컬럼이나 테이블명만 다른 경우가 있다.

이럴때 동적으로 컬럼과 테이블만 매핑해주면

 

쿼리의 양을 줄일 수 있다.

그럼 그 사용방법을 알아보자.

 

보통 iBatis를 활용해 값을 바인딩 할때 #value# 를 사용했을 것이다.

예를 들면

SELECT *
  FROM TABLE1
 WHERE COLUME1 = #value#

이런식으로.

 

위와 같이 #을 사용하면

 

SELECT *
  FROM TABLE1
 WHERE COLUME1 = ?

 

와 같은 쿼리의 ? 에 해당 #value# 값이 바인딩 되는 것이다.

 

테이블이나 컬럼위치에 값을 바인딩해서 사용하면

 

SELECT #COLUME1#
   FROM TABLE1

 

java.sql.SQLException: ORA-01747: 열명을 올바르게 지정해 주십시오

 

위와 같은 에러를 보게 될 것이다.

 

이를 해결하기 위해 사용하는 것이 $ 이다.

위의 예에서 #만 $으로 바꾸어 사용하게 되면

 

SELECT $COLUME1$
   FROM TABLE1

 

원하는 값이 나오게 된다.

table도 마찮가지 이다.

 

SELECT COLUME1
   FROM $TABLE1$

 

이렇게 $를 사용하면 직접 그 값을 불러와 사용할 수 있다.

 

하지만 여기에도 주의점이 있다. 여러군데서 동적으로 쿼리문을 사용할 경우

iBatis 에 저장된 캐쉬에 의해 자꾸 전에 사용된 컬럼이나 테이블 값이 매핑된다.

 

이전 테이블에서 사용한 키나 테이블이 매핑이 되니 오류는 자연스럽게 발생한다.

 

java.sql.SQLException: 부적합한 열 이름

 

이를 해결하는 옵션이 remapResults="true" 이다.

 

<select id="CmmnDao.getMaxId" remapResults="true" parameterClass="searchVO" resultClass="java.lang.String">
    SELECT MAX(T1.$keyName$) KEEP(DENSE_RANK FIRST ORDER BY REG_DTM DESC)
      FROM $tableName$ T1
 </select>

 

위와 같이 사용하면 동적 테이블이나 컬럼을 활용할 수 있다.

 

위의 예에서 사용된 Oracle KEEP() 함수의 사용법은 아래의 Link를 참조한다.

 

Link : Oracle 오라클 KEEP()함수 사용법 그룹함수로 조회한 행 중에 다른 컬럼 가져오는 방법

 

반응형