반응형
<isEqual property="pivut" comparableValue="Y">
SELECT
A
,B
,C
FROM TB_DATA;
</isEqual>
<isNotEqual property="pivut" comparableValue="Y">
SELECT
A
,B
FROM TB_DATA;
</isNotEqual>
=> 에러발생
[원인]
ibatis에서는 쿼리 id 마다 캐쉬를 저장하고 있고, 캐쉬 값에 따라 resultSet을 매핑하는데,
처음 실행했을때는 pivut 값이 "Y"여서 resultSet이 A,B,C 인데,
다음에 실행했을때 pivut 값이 "Y"가 아니면 실행되는 쿼리의 조회결과의 resultSet은 A,B로
캐시에 저장된 resultSet 값과 상이하여 에러가 발생하는 것이다.
[해결방법 1]
조회하는 값의 갯수와 칼럼명을 맞춘다.
<isEqual property="pivut" comparableValue="Y">
SELECT
A
,B
,C
FROM TB_DATA;
</isEqual>
<isNotEqual property="pivut" comparableValue="Y">
SELECT
A
,B
,'' AS C
FROM TB_DATA;
</isNotEqual>
[해결방법2]
select 태그에 속성으로 remapResult="true" 를 추가한다.
ibatis에서는 쿼리문 id마다 캐쉬를 저장하고 있기 때문에
캐쉬값에 따라 result값을 맵핑한다고...
문제 해결을 위해서는 remapResults="true" 속성을 추가해주면, 기존 캐쉬를 무시하고
현재 쿼리를 기본으로 맵핑한단다.. (default는 false)그래서 결론은 이런식으로..
=> remapResult 속성을 true로 주면 해당 쿼리를 쿼리 실행할때 기존 캐시를 무시하고 query와 resultSet을 새로 생성하여
자주사용하는 쿼리의 경우에는 해당 속성을 추가하는 것은 부적합하다.
때문에 해결방법1이 simple한것 같다~
반응형