Web/스프링

[Mybatis] 동적 쿼리 작성 (가변 컬럼)

벨포트조던 2017. 6. 14.
반응형

http://seodh2000.tistory.com/19


[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
      ...

* Result

 

-  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 예제 문서

http://mybatis.org/mybatis-3/ko/dynamic-sql.html



출처: http://seodh2000.tistory.com/19 [BreakingBad]

출처: http://seodh2000.tistory.com/19 [BreakingBad]

반응형

댓글