본문 바로가기
개발/MyBatis

[MyBatis] 반복되는 쿼리 작성하기 <foreach>

by zuzuu 2022. 1. 6.
반응형

 

<foreach>

collection 인자(Map, Array, List, Set 등..) 값으로 반복적인 SQL 구문을 작성하기 위해 사용된다. (OR 또는 IN 구문에서 주로 사용된다.)

foreach는 6개의 속성이 있다.

  • collection - 전달받은 인자 (Map, Array, List, Set등과 같은 객체)
  • item - collection 속성에서 전달받은 인자값을 alias명으로 대체
  • open - 해당 구문이 시작될 때 삽입할 문자열
  • close - 해당 구문이 종료될 때 삽입할 문자열
  • separator - 반복되는 구문 사이에 삽입할 문자열 (구문을 분리하기 위한 문자)
  • index - 반복되는 구문 번호. 0부터 순차적으로 증가

 

예제

 a, b, c가 담겨 있는 list가 있고, 해당 list에 해당하는 값을 구하고자 할 경우

SELECT 
	name, type, value
FROM sample 
WHERE 1 = 1
	AND region = #{region}
	<foreach collection="valueList" item="type" open="(" close=")" separator="or">
		type = #{type}
    </foreach>

 


 

난 선택한 조건에 해당하는 월별 통계를 구하기 위해 <foreach> 태그를 사용했다. (oracle, tibero 쿼리)

<foreach collection="monthArr" item="item" separator=" , " open = "," close="" >
	SUM(NVL(CASE WHEN B.DATE_ =#{item} THEN B.CNT END, 0))
</foreach>

 

 

monthArr에는 사용자가 선택한 조건이 담겨있는데

예를 들어 아래와 같이 조건을 입력하고 조회를 했다면 monthArr에는 2021-11, 2021-12, 2022-01 데이터가 담겨 있다.

 

그리고 로그를 보면 아래와 같이 쿼리가 실행된 것을 볼 수 있다.

, SUM(NVL(CASE WHEN A.DATE_ = '2021-11' THEN A.CNT END, 0)) AS "2021-11" 
, SUM(NVL(CASE WHEN A.DATE_ = '2021-12' THEN A.CNT END, 0)) AS "2021-12" 
, SUM(NVL(CASE WHEN A.DATE_ = '2022-01' THEN A.CNT END, 0)) AS "2022-01"

open 속성에 콤마를 작성했기 때문에 반복문의 첫 시작이 콤마로 시작되었고, 반복문을 구분하는 속성인 separator은 콤마로 작성했기 때문에 반복문의 사이에 콤마가 있다.

그리고 close 속성은 아무값도 세팅하지 않아서 반복문의 끝에 아무 데이터도 없다.

 

 

728x90
반응형

'개발 > MyBatis' 카테고리의 다른 글

[MyBatis] 변수 사용시 #{value}, ${value}의 차이  (1) 2021.11.30

댓글