관리 메뉴

ふたりで

jstl forEach 동적 items의 key 참조?? 본문

Other

jstl forEach 동적 items의 key 참조??

graykang 2021. 6. 4. 18:20
728x90
반응형
SMALL
	public List<Map<String, Object>> getOrderDeliveryInfoList(SearchParamOrderListBySupplierVO searchParam) {		
		return supplierMapper.selectOrderDeliveryList(searchParam);
	}

특정 리스트가 있다 해당 리스트의 컬럼명은 쿼리상에서도 갯수가 가변적으로

변하며 넘어 오게 만들었다... 란 가정하에 jstl에서도 해당 컬럼에 맞게끔

조건에따라 가변적으로 변하게 해줘야 한다.

1. 동적 컬럼결과를 출력 하는 쿼리.

2. 해당 쿼리 관련 mybatis 사용법

3. jstl에서 동적 key 참조 처리.

 

#. query+mybatis : 아래 소스는 상품별 수량을 조회하는 기본 쿼리에 매장리스트 만큼 루프를 돌며

JOIN하여 결과를 출력 해 줄수 있게 mybatis를 적용한 내용이다.

(주문 코드 갯수와 기준 매장의 갯수는 선택한 매장 만큼 유동적이다.)

 	<select id="selectOrderList" resultType="java.util.LinkedHashMap">
 		SELECT
 			ord_code AS ordCode
			, goods_barcode AS sGoodsBarcode
			, goods_name AS sGoodsName
			, SUM(qtysum) AS sQtysumTotal
				<foreach collection="martList" item="item" index="index" separator="" open="" close="">					
					,SUM(IFNULL(qtysum_${item.martCode},0)) AS sQtysumTotal_${item.martCode}
				</foreach>
		FROM(
			SELECT 
				ord_code 
				, goods_barcode  
				, goods_name  
				, goods_sspec 
				, qtysum 
			FROM ORDER_LIST AS SOL
			WHERE SOL.bizno = #{Bizno}
			AND SDD.sordd_code IN
		        <foreach collection="ordCodeArray" item="ordCodeArray" index="index" open="(" close=")" separator=",">
            		#{ordCodeArray}
        		</foreach>
			) MA
				<foreach collection="martList" item="item" index="index" separator="" open="" close="">
					LEFT JOIN
					(
					SELECT 
						ord_code AS ordCode_${item.sordMart}
						,goods_barcode AS goods_barcode_${item.martCode}
						,qtysum AS qtysum_${item.martCode}
					FROM SUPPLIER_ORDER_LIST AS SOL
					WHERE SOL.sord_sup_bizno = #{Bizno}
			        AND SOL.mart = ${item.martCode}
					AND SDD.ord_code IN
				        <foreach collection="ordCodeArray" item="ordCodeArray" index="index" open="(" close=")" separator=",">
		            		#{ordCodeArray}
		        		</foreach>
					) `${item.martCode}`
					ON MA.goods_barcode = `${item.martCode}`.ord_goods_barcode_${item.martCode}
				</foreach>
		WHERE 1=1
		GROUP BY MA.goods_barcode
		;
	</select>
728x90
반응형
SMALL

#. jstl 에서의 처리 아래 jstl에서는 기본적으로 orderInfoList를 출력 하며, 추가로 td 를 매장 수만큼 가변적으로

표시해 줘야 하기에 martList를 참조하며 td를 표시한다.

주!! 동적 컬럼Key가 매핑 되는 부분은 c:set 부분(value="QtysumTotal_${c.martCode}")과 바로 아래 td 부분에 key맵핑을 한곳이다  ${p[name]}  이렇게 하면 jstl에서 forEach사용시 상위 리스트값을 동적으로 참조 할 수 있다.

<c:forEach var="p" items="${orderInfoList}" varStatus="status">
  <tr>
    <td class="text_center">
    ${status.index+1}
    </td>
    <td class="text_center">${p.sGoodsBarcode}</td>
    <td class="text_left">${p.sGoodsName}</td>
    <td class="text_center">${p.sGoodsSspec}</td>
    <td class="text_rigth">${p.sQtysumTotal}</td>
    <c:forEach var="c" items="${martList}"> 
      <c:set var="name" value="QtysumTotal_${c.sordMart }"/> 
      <td class="text_rigth">${p[name]}</td> 
    </c:forEach>
  </tr>
</c:forEach>

# 참고로 mybatis 쿼리 부분에서 resultType을 java.util.LinkedHashMap 으로 받기 때문에 DAO 부분에서는 아래와 같이

List<map<string, object>>로 해주어야 한다.(아래는 서비스에서 mapper로 바로 호출 하는 방식)

중요한건 List<Map<String, Object>>

	public List<Map<String, Object>> getOrderDeliveryInfoList(SearchParamVO searchParam) {
		return Mapper.selectOrderDeliveryList(searchParam);
	}
728x90
반응형
LIST
Comments