코린이
Published 2023. 11. 1. 21:51
MyBatis / sql 동적 쿼리 list 개발/Spring

회사에서 MyBatis를 처음써봤다... 

<sql id="ex_query>
	AND user_age = #{user_age}
</sql>
<select resultType = "userVo" parameterType="userVo">
    SELECT user_id
    FROM user
    WHERE 1=1
    <include refid="ex_qurey">
</select>

대충 이런 쿼리가 있다고 했을 때 user_phone가 있으면 where절에 추가해주고싶다! 는

<sql id="ex_query>
	AND user_name = #{userName}
    <if test="userPhone != null">
    	AND user_phone = %{userPhone}
    </if>
</sql>

이런식으로 if문에 넣어주면 된다.

그렇다면 파라미터가 list라면 어떻게 해야할까!

예를들어 수업을 수학, 과학을 듣는 유저를 찾고싶다. 그래서 나는 userSubject로 [수학, 과학]이렇게 넘겨줬는데

앞에는 AND, 뒤에부터는 OR이 들어가야한다.

 

이럴 때는

 

<if test="userSubject.size != 0">
	AND
    <foreach item="subject" collection="userSubject" open="(" close=")" index="index">
        <if test="index == 0">
            user_subject = #{subject}
        </if>
        <if test="index != 0">
            OR user_subject = #{subject}
        </if>
    </foreach>
</if>

이런식으로 해주면 된다!

 

item = 아이템의 별칭

collection = 들고온 list 

open, close = 쿼리문을 열고 닫아줄 글자, or로 묶으려면 괄호로 열고 닫아야하기 때문에 (, )을 사용했따

index = 리스트의 인덱스

 

결과로는

<select resultType = "userVo" parameterType="userVo">
    SELECT user_id
    FROM user
    WHERE 1=1
    AND user_age = #{user_age}
    AND (user_subject = #{subject}
      OR user_subject = #{subject})
</select>

이런 쿼리가 완성됨!

반응형
profile

코린이

@코인아님

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!