[Mybatis] 동적 쿼리 작성 (가변 컬럼)
* 간만에 Spring 프레임웍을 이용하여 보고서 페이지를 개발 하던중
가변컬럼 조회 쿼리를 개발하게 되었음
.Net 만 하다가 다시 Java Web Page개발 하려니;; 익숙치 않다..
mybatis에서 가변 컬럼 동적쿼리 작성한 관련 내용을 정리함.
* 요건은 다음과 같음
1. 다음과 같은 테이블 2개가 있음(대략 중요한 컬럼만..)
1) 계정 정의된 AcctTable
2) 회사별 계정 금액이 저장된 AmtTable
3) 두 테이블의 데이터는 가변적임
AcctTable |
|
AmtTable |
|||
CD_ACCT | NM_ACCT | CD_COMP | NM_ACCT | AMT | |
A | 자산 | 회사A | A | 100 | |
B | 유동자산 | 회사A | B | 200 | |
C | 비유동자산 | 회사A | C | 300 | |
D | 자산총계 | 회사A | D | 100 | |
E | 부채총계 | 회사B | A | 200 | |
… | 회사B | B | 300 | ||
회사B | C | 100 | |||
회사C | A | 200 | |||
회사C | C | 300 | |||
회사C | D | 400 | |||
... |
- Acct 테이블의 데이터를 컬럼으로 회사별 계정금액 보고서 작성
- Select절을 가변적으로 설정해야함
Result | |||||||
CD_COMP | A | B | C | D | E | F | ... |
회사A | 100 | 100 | 300 | 400 | ... | ||
회사B | 200 | 300 | 100 | ... | |||
회사C | 200 | 300 | 400 | ... |
* 쿼리는 다음과 같다.
* foreeach문 사용, 계정정보를 조회하여 List 형태 매개변수로 받음
* cdAcctList 는 Report의 속성으로 List<Object> 타입
<!-- 보고서 조회 쿼리 -->
<select id="selectReport" parameterType="Report" resultType="java.util.HashMap" >
SELECT C.NM_COMP,
<foreach collection="cdAcctList" item="i" separator="," index="index"> --> index는 0부터 시작함
MAX(DECODE(ACCT.CD_ACCT, #{i}, NVL(AMT.AMT, 0))) AS "${index}" --> 컬럼명은 index로 0, 1, 2, 3 ...
</foreach>
FROM COMP C
LEFT JOIN ACCTTABLE ACCT ON 1=1
LEFT JOIN AMTTABLE AMT
ON C.CD_COMP=AMT.CD_COMP AND ACCT.CD_ACCT = AMT.CD_ACCT
GROUP BY C.NM_COMP
ORDER BY C.NM_COMP
</select>
** #{variable} 과 ${variable}의 차이
#{variable} : ''을 포함한 값을 반환 ex) variable 이 aaa라면 -> 'aaa'
${variable} : 값만 반환
** mybatis 동적 SQL 예제 문서
'JAVA' 카테고리의 다른 글
Gmail로 SMTP 메일 보내기 설정 (Java Springframework) (0) | 2015.11.05 |
---|