본문 바로가기

개발자노트/DBMS

아이바티스 include 서브쿼리 ( 검색 + 정렬 ) , sql,jqgrid 공지사항

게시판을 출력해주는 SQL문이 있다.

통상적으로 아이바티스의 경우

 

<select id="DAO.selectList" parameterClass="VO" resultClass="Map">

이런 식으로 해당 쿼리문을 실행할 id와, input, output으로 수행한다. 

 

기본적으로 게시판 selectAll 문에는 serach 즉 검색이 포함되어 있는 경우가 많다.

 

내가 이 서브쿼리를 사용하게 된 이유는 , 1순위공지사항이 최상단에 출력되고,

그 후에 출력 되는 것들은 PK에 의해 출력 되고, 그 후 페이징처리를 위해 cnt값을 넘겨주어야 했다.

 

 

 

먼저 serach를 통해 select 될 아이바티스 sql문을 작성한다.

 <sql id="searchList">
		/* DAO.selectList */
		SELECT A.컬럼1
		       , A.컬럼2
		       , A.컬럼3
		  FROM 테이블명 A
	     WHERE 1=1
	     <isNotEmpty prepend="AND" property="search조건1">
		     A.조건1컬럼 = #search조건1#
			 </isNotEmpty>
		 <isNotEmpty prepend="AND" property="search조건2">
		     A.조건2컬럼 = #search조건2#
		 </isNotEmpty>
		 <isNotEmpty prepend="AND" property="search조건3">
		     A.조건3컬럼 LIKE '%'||#search조건3#||'%'
		 </isNotEmpty>
		ORDER BY DECODE(A.NOTICE_AT, 'Y', 1 ), A.PK DESC
	</sql>

이렇게 하게 되면 serachList라는 곳에 notice_AT가 Y인 것에 1 이라는 값이 들어가게 되고,

그 후 정렬조건에 따라 정렬이 된다. 보통 PK 순으로 정렬을 하니 PK로 가정한다.

 

<select id="DAO.selectList" parameterClass="VO" resultClass="Map">
		/* DAO.selectList */
		SELECT *
		FROM (
		SELECT ROWNUM AS RNUM, A.*
		FROM(
		<include refid="searchList" /> <!-- 정제 된 List를 include -->
		) A
		) WHERE RNUM BETWEEN #firstIndex# AND #lastIndex#
	</select>

실제로 호출하게 될 DAO.selectList를 수행할 때,

검색조건에 의해 정제 된 List를 include 하여 RNUM을 통해 다시 정렬하게 된다.

이 때 WHERE 조건에 의해, index 번호 즉 cnt 값을 넘길 수 있는데, 

결과적으로 DECODE를 이용해 NOTICE_AT 의 값을 1/0으로 비교하여 상단에 출력할 수 있고,

그 후에는 PK에 따라 정렬되며, 페이징을 위한 index=cnt 를 매핑하여 처리할 수 있게 된다. 

 

결과화면

 

전체 13건의 게시글에서, 한페이지에 10개까지 출력이 되며,

상단에 1, 2번 글은 공지사항으로 등록되어 있어 등록 순서와 상관 없이 최상단에 뜨게 하였으며, 

공지사항인 것을 명시해주기 위해 배경 색상을 변경해주었다.

 

이 때 , jqGrid를 사용하였는데 jqGrid는 표를 다 만들어주기 때문에 Grid를 생성할 때 당시 조건을 걸어야 해당 값에만 배경이 바뀌게끔 할 수 있어 고생을 하였다.

필요한 사람이 있을지 몰라 소스도 남기겠다.

, loadComplete : function(data) {
            var ids = $("#gridArea").getDataIDs();
             // 해당id에 있는 gridData를 ids로 가져온다.
             $.each(
                     ids,function(idx, rowId){
                     rowData = $("#gridArea").getRowData(rowId);
                 // rowData의 공지여부가 Y라면
                 if (rowData.noticeAt == 'Y') {
                  $("#gridArea").setRowData(rowId, false, { background:"#d9e6ff" });
                }
            }
             );
		    	fnCreateGridRow('gridArea', $("#gridArea").jqGrid("getGridParam").emptyrecords, data);
            }

 

해당 부분의 each 문을 참조하면 된다.