새소식

ibatis

ibatis::Dynamic Query에 OR문 추가할 때 써먹을 작은 팁

  • -

AND 조건이 난무하는 쿼리가 있었다.

SELECT *
  FROM EMP
 WHERE 1=1
 <dynamic>
   AND …
   <isNotEmpty property=“…”>
       AND …    
   </isNotEmpty>
 </dynamic>

이 쿼리에 OR조건이 사용되어야하는 요구사항을 받게 되었다.

특정 도시가 고향이거나 그 도시에 거주하고 있는 직원 데이터 조회하는 기능을 만들어달라는 요구라고 하자.

다이나믹 태그를 이용해서 짜보았다.

SELECT *
  FROM EMP
 WHERE 1=1
 <dynamic>
   AND …
   <isNotEmpty property=“…”>
           AND …    
   </isNotEmpty>
   <isNotEmpty property=“cityName” prepend=“AND” open=“(“ close=“)”>
           <isEqual preperty=“residenceYn” comparevalue=“Y” prepend=“OR”>
               RESIDENCE = #cityName#
           </isEqual>
           <isEqual preperty=“hometownYn” comparevalue=“” prepend=“OR”>
               HOMETOWN = #cityName#
           </isEqual>
   </isNotEmpty>
 </dynamic>

다이나믹 조건을 모두 만족한다면 이런 쿼리가 실행된다.

SELECT *
  FROM EMP
 WHERE 1=1
   AND …
    AND …    
   AND (OR RESIDENCE = #cityName#
          OR HOMETOWN = #cityName#
   );

오류가 났다.

6번라인의 ‘AND(‘ 다음 오게되는 ‘OR’ 이 원인이었다.

OR 앞에 1=0라는 거짓조건을 고정으로 넣어주어서 해결했다.

(참고로 거짓조건 대신 참조건 1=1을 넣으면 전체 데이터 조회가 되어버린다.)

SELECT *
  FROM EMP
 WHERE 1=1
 <dynamic>
   AND …
   <isNotEmpty property=“…”>
           AND …    
   </isNotEmpty>
   <isNotEmpty property=“cityName” prepend=“AND” open=“(“ close=“)”>
           1=0
           <isEqual preperty=“residenceYn” comparevalue=“Y” prepend=“OR”>
               RESIDENCE = #cityName#
           </isEqual>
           <isEqual preperty=“hometownYn” comparevalue=“” prepend=“OR”>
               HOMETOWN = #cityName#
           </isEqual>
   </isNotEmpty>
 </dynamic>

다이나믹 조건을 모두 만족하면 이런 쿼리가 실행된다.

SELECT *
  FROM EMP
 WHERE 1=1
   AND …
    AND …    
   AND (1=0
         OR RESIDENCE = #cityName#
     OR HOMETOWN = #cityName#
   );

성공!

Contents