🌷🌼모여봐요 개발의숲🌷🌼
[IBatis] prepend의 and가 안붙을때 본문
반응형
- 문제 쿼리 -
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" 를 붙여주자
'개발 > SQL' 카테고리의 다른 글
[MySQL, Spring] Unable to load authentication plugin 'caching_sha2_password' 해결 방법 (0) | 2022.10.21 |
---|---|
[SQL] 테이블 안의 특정 컬럼 내 가장 길이 긴 값 찾기 (0) | 2022.10.12 |
[큐브리드] 프로시저 메모리 누수 (0) | 2022.07.28 |
[CUBRID] DB 언어 셋 변경하기 (0) | 2022.05.11 |
[postgresql] psql로 테이블 dump export하기 (0) | 2022.01.13 |
Comments