-
[Mybatis] 동적쿼리 foreach문 Null 체크프로젝트 2024. 9. 1. 18:29
부장님께서 말씀해 주신 두 번째는 mybatis > list로 파라미터가 넘어올 때 foreach문에서 null 체크하는 부분이었다.
<mapper namespace="ex.repository.ExRepository"> <!-- ex 조회 --> <select id='retrieveExList' resultType='ex.dto.RetrieveExOutDto'> SELECT EX_CD AS CODE , EX_NM AS NAME , EX_CD||'.'||EX_NM AS VALUE FROM EX_TABLE WHERE 1 = 1 <if test='exCd != null and exCd != ""'> AND EX_CD IN <foreach collection='exCd' item='item' index='index' open='(' close=')' separator=','> #{item} </foreach> </if> ORDER BY 1 ASC /* ONLINE : [ex.repository].[ExRepository].[retrieveExList] */ </select> </mapper>
우선 이번 프로젝트를 진행하면서 Array/List를 파라미터로 넘길 때
매퍼에서 바로 <foreach> 를 사용하면 된다는 점을 알게 되었다.
[매퍼 > foreach + where...in] 기억하기
간단한 이 코드를 모르니 서비스단에서 어떻게 해결해야 할지 고민을 하고 있으니 옆자리 차장님께서 알려주셨다...
여하튼, 이렇게 리스트가 넘어올 때 null 체크하는 방법이 있는데 리스트가 아닌 파라미터가 넘어올 때와 차이가 있다.
<if test='exCd != null and exCd != ""'>
잘못되었다고 예시로 알려주신 코드를 가지고 온 건데 여기서 문제는 이 부분이다.
list 혹은 array가 아닌 경우 이렇게 사용하면 된다.
<if test='exCd != null and exCd.size() != 0'>
위와 같이 list 혹은 array로 넘어온 경우 "" 비교하는 것이 아니라 size를 비교해 줘야 한다.
첫 번째와 같이 코드를 작성해도 작동은 되니 더욱 조심해야 하는 부분인 것 같다.
cf.
<foreach collection='exCd' item='item' index='index' open='(' close=')' separator=','> #{item} </foreach>
- collection : ArrayList 형 (전달받은 인자값, List 혹은 Array만 가능)
- item : 전달받은 인자값을 다른 이름으로 대체
- index : 반복되는 구문 번호, 0부터 순차적으로 증가
- open : 구문이 시작될 때 추가할 문자열
- close : 구문이 종료될 때 추가할 문자열
- separator : 구분
728x90'프로젝트' 카테고리의 다른 글
[Spring] 저장 @Transactional 선언적트랜잭션 (0) 2024.09.01 [Java / Spring] @Valid & @Validated (0) 2024.09.01 [스프링부트/intellij/maven] JPA Querydsl 추가 (0) 2024.02.14 CORS란 ? (0) 2023.05.05 schema란? (0) 2023.05.04