Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

자바나라

[Mybatis] SQL 쿼리에서 array 를 foreach로 전개하는 법 / string과 type 구분하는 법 본문

오늘 배운 자바

[Mybatis] SQL 쿼리에서 array 를 foreach로 전개하는 법 / string과 type 구분하는 법

주데브 2022. 12. 9. 10:32

문제상황 : boardId 라는 파라미터가 다중선택시엔 Array로, 단일 선택시에는 String으로 넘어오고 있다.

해결책 :  쿼리를 2개로 분리하는 방법도 해결책이 될 수 있겠지만,

               향후 유지보수 용이성을 고려하여 파라미터의 type에 따라 동적으로 조회하는 쿼리를 짜보았다.

 

1. SQL 쿼리에서  array를  foreach로 전개하는 법 

1
2
3
4
5
where boardId IN (
    <foreach collection="boardId" index="index" seperator=" , ">
         #{boardId[${index}]}
    </foreach>
)
cs

→ 이 쿼리에서 boardId에 String이 들어오는 경우 "boardId는 iterable 하지 않다." 는 문구가 뜬다.

 프론트나 자바단에서 파라미터가 String인 경우 Array[0]에 넣는 전처리 로직을 추가하여 해결할 수도 있다.

그러나 필자의 경우는 SQL을 직접 call 하는 경우여서 전처리가 불가했고, 동적인 조회 쿼리가 필요했다.

 

 

2. Array와 String 의 type 구분하여 동적으로 조회하는 법

: Mybatis는 Java 기반으로 하기 때문에 Java의 메소드 사용이 가능하다.

따라서 instanceof 를 사용하면 쉽게 변수의 type을 쉽게 구분할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
where boardId IN (
 <if test = "!boardId instanceof String" >
    <foreach collection="boardId" index="index" seperator=" , ">
         #{boardId[${index}]}
    </foreach>
 </if>
 <if test = "boardId instanceof String" >
     #{boardId}
 </if>
)
cs

 

 

 

도움되셨길 바라며, 질문이나 오류는 댓글로 남겨주세요.

Comments