iBatis 동적 생성 쿼리()시 이전 컬럼 정보를 가지고 현재 컬럼정보에 강제 매핑하는 현상..
원문은 권남님의 블로그에.. ^^
증상.
쿼리는 정상 실행되는데, 결과에는 특정 컬럼이 없거나, 컬럼 맵핑 정보에 있는 어떤 컬럼이 쿼리 결과에 없다고 에러가 발생
원인.
iterate 뿐만 아니라, isEqual, isNotNull 등등을 이용해 한 id 의 쿼리 내에서 특정 컬럼을 조건에 따라 나타내거나 빼야 할 경우에 이런 현상이 발생할 수 있습니다. 이는 iBatis 가 쿼리의 맵핑 정보를 캐슁하기 때문입니다. 즉 동일 id 에서라면 같은 맵핑 정보가 사용되는 것이 대부분이다보니 성능 향상을 위해 이렇게 처리한 것 같습니다.
해결책.
쿼리 선언부에 remapResults="true" 을 추가해 줍니다. 그럼 매번 쿼리시마다 맵핑 정보를 새로 갱신합니다.
개인의견.
저런 경우라면 쿼리 자체를 분리하는 것은 어떨까 합니다. 대부분의 중복되는 코드는 쿼리 조각으로 뽑아내고 다른 부분들만 별도의 쿼리로 만드는 겁니다.
원문은 권남님의 블로그에.. ^^
증상.
쿼리는 정상 실행되는데, 결과에는 특정 컬럼이 없거나, 컬럼 맵핑 정보에 있는 어떤 컬럼이 쿼리 결과에 없다고 에러가 발생
원인.
iterate 뿐만 아니라, isEqual, isNotNull 등등을 이용해 한 id 의 쿼리 내에서 특정 컬럼을 조건에 따라 나타내거나 빼야 할 경우에 이런 현상이 발생할 수 있습니다. 이는 iBatis 가 쿼리의 맵핑 정보를 캐슁하기 때문입니다. 즉 동일 id 에서라면 같은 맵핑 정보가 사용되는 것이 대부분이다보니 성능 향상을 위해 이렇게 처리한 것 같습니다.
해결책.
쿼리 선언부에 remapResults="true" 을 추가해 줍니다. 그럼 매번 쿼리시마다 맵핑 정보를 새로 갱신합니다.
개인의견.
저런 경우라면 쿼리 자체를 분리하는 것은 어떨까 합니다. 대부분의 중복되는 코드는 쿼리 조각으로 뽑아내고 다른 부분들만 별도의 쿼리로 만드는 겁니다.



덧글