개발/Spring
MyBatis / sql 동적 쿼리 list
코인아님
2023. 11. 1. 21:51
회사에서 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>
이런 쿼리가 완성됨!
반응형