flowerspring

이번에 프로젝트를 하면서 동일한 성격의 테이블이 여러개라 하나의 쿼리를 두고 테이블 명과 몇가지 다른 컬럼에 대해서는 동적으로 생성해서 가져오게 했다..
하지만 몇번 재대로 실행이 되는가 싶더니 테스트 진행 과정에서 컬럼을 가져오지 못하는 현상이 발생했다. 

일단은 혹시나 모를 문제가 있지 않을까 해서 쿼리를 분리하고 동적으로 생성되어야 되는 부분은 쿼리를 따로 작성해서 select 하도록 하였다.

후에 이 문제에 대해서 살펴봤더니 원인은 ibatis가 매핑 정보를 캐싱하기 때문이라고 한다.

이문제를 해결하려면 다음과 같이 사용할수가 있다.

<select id="select" remapResults="true" parameterClass="dataMap" resultClass="dataMap">
 SELECT  
     bbs_seq
    ,title
    ,contents
    ,register_date
   <isEqual property="table" compareValue="photo_gallery">
       ,image_name
       ,image_path
       ,image_size
  </isEqual>      
FROM $table$
<include refid="globalWhere" />
</select>

다음 코드는 일반적으로 같은 내용을 담고 있지만 photo_gallery 테이블인 경우는 image_name, image_path, image_size 컬럼을 동적으로 생성해서 가져오는 쿼리이다.
일반적으로는 파일 테이블을 따로 두겠지만 예제를 설명하기 위해서 위와 같이 하였다..

위에 테이블에서 remapResults="true" 부분이 없을 경우 위에서 설명한 에러가 발생할수가 있다 하지만 이부분을 넣어 주면서 쿼리를 가져올때 매번 새로 생성한 쿼리를 가져오기 때문에 다음부터는 동적으로 컬럼을 가져오면서 발생한 에러를 해결 할 수가 있다. 

Comment +1

  • 저문제는 $$ 를 쓰기 때문인데 ##과 다른점은 ##은 작은 따음표(')를 쿼리에 반영하는 반면 $$는 넘겨받은 문자열 그대로를 넣기 때문이지

    캐싱을 사용하고 싶은데 $$를 써야하면 어떻게 해야하지??????????????알려줘