ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.