🌷🌼모여봐요 개발의숲🌷🌼

[IBatis] prepend의 and가 안붙을때 본문

개발/SQL

[IBatis] prepend의 and가 안붙을때

요일이 2022. 10. 11. 13:58
반응형

-  문제 쿼리 - 

select
	a
    b
    c
from 
	table
    
<dynamic prepend="WHERE">
     a LIKE '%' || TRIM(#aName#) || '%'
    <!-- 문제 발생지역! prepend가 안먹혀 and절 생성이 안됨 -->
    <isEqual prepend="AND" property="searchTreeGb" compareValue="1">
         b LIKE '%' || TRIM(#bName#) || '%'
    </isEqual>
</dynamic>

dynamic의 prepend에 where절을 붙여서 사용하였고

그 아래 isEual로 하여금 prepend로 앞에 and를 붙이고자 하였으나

에러로그를 확인한 결과 실행된 쿼리의 where절에 and가 자동으로 붙지 않은 현상을 발견했다.

 

- 실행 쿼리 -

select
	a
    b
    c
from 
	table
where
	     a LIKE '%aaa%'
         b LIKE '%bbb%'

 

 

- 해결방법 - 

1. prepend대신 open을 쓴다

select
	a
    b
    c
from 
	table
    
<dynamic prepend="WHERE">
     a LIKE '%' || TRIM(#aName#) || '%'
    <!-- prepend를 open으로 변경 -->
    <isEqual open="AND" property="searchTreeGb" compareValue="1">
         b LIKE '%' || TRIM(#bName#) || '%'
    </isEqual>
</dynamic>

prepend를 open으로 변경하는 방법이다.

 

 

 

2. 첫번째 자식에도 prepend를 붙여준다

select
	a
    b
    c
from 
	table
    
<dynamic prepend="WHERE">
	<!-- 첫번째 자식에도 prepend 붙여주는 방법 -->
    <isEqual prepend="AND" property="searchTreeGb" compareValue="1">
     a LIKE '%' || TRIM(#aName#) || '%'
     </isEqual>
    <isEqual prepend="AND" property="searchTreeGb" compareValue="1">
         b LIKE '%' || TRIM(#bName#) || '%'
    </isEqual>
</dynamic>

dynamic에서 먼저 prepend를 붙여 where절을 사용하였기 때문에 !첫번째! 자식 prepend는 무시된다.

즉. a LIKE '%' || TRIM(#aName#) || '%' 에는 무조건 and가 붙지 않는다.

그리고

두번째 자식부터는 prepend의 and가 붙을것이다.

and b LIKE '%' || TRIM(#bName#) || '%' 이렇게.

 

 

 

-결론-

<dynamic prepend="WHERE"> 는 첫번째로 등장하는 prepend를 무시하기 때문에 여러 줄로 and를 붙여야한다면 꼭 첫번째 자식에도 prepend = "and" 를 붙여주자

Comments