샘플 게시판 페이징 처리 (밑에 올린 질문) 해결법..
- 작성자 :
- 서*민
- 작성일 :
- 2011-04-07 13:35:38
- 조회수 :
- 3,301
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
질문은 아니고 해결법입니다.
db쿼리 문제가 있는건 맞으며..
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT A.ID, A.NAME, A.DESCRIPTION, A.USE_YN, A.REG_USER
FROM
(
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER, ROWNUM
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) A
WHERE ROWNUM BETWEEN #firstIndex# AND #recordCountPerPage# + #firstIndex#
</select>
이부분에서 ROWNUM는 BETWEEN 1 and ??는 가능하나.. 2이상 and ??는 안된다는군요..
해서 위 쿼리에 ROWNUM AS rnum 이부분을 넣고.. WHERE rum BETWEEN ?? and ?? 할 경우에.. 제대로 처리되는듯 싶으나.. 정렬이(현 샘플에서는 게시판id로 정렬되게 되어있음) 엉망이 되고..
해서..
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT A.ID, A.NAME, A.DESCRIPTION, A.USE_YN, A.REG_USER
FROM
(
SELECT
AA.ID, AA.NAME, AA.DESCRIPTION, AA.USE_YN, AA.REG_USER, ROWNUM as RNUM
FROM
(
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER, ROWNUM
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) AA
WHERE ROWNUM BETWEEN 1 AND #firstIndex# + #recordCountPerPage#
) A
WHERE RNUM BETWEEN #firstIndex# AND #firstIndex# + #recordCountPerPage#
</select>
이와같이 하면 제대로 나오더군요..
확인해보시고.. 잘못된 부분이나.. 더 좋은 방법이 있으면 알려주셨으면 합니다~
그럼 수고하세요..
P.S : 게시판 내용칸이 작아 보기 힘들까봐 TXT파일로 질문글 그대로 붙여 첨부합니다.
db쿼리 문제가 있는건 맞으며..
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT A.ID, A.NAME, A.DESCRIPTION, A.USE_YN, A.REG_USER
FROM
(
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER, ROWNUM
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) A
WHERE ROWNUM BETWEEN #firstIndex# AND #recordCountPerPage# + #firstIndex#
</select>
이부분에서 ROWNUM는 BETWEEN 1 and ??는 가능하나.. 2이상 and ??는 안된다는군요..
해서 위 쿼리에 ROWNUM AS rnum 이부분을 넣고.. WHERE rum BETWEEN ?? and ?? 할 경우에.. 제대로 처리되는듯 싶으나.. 정렬이(현 샘플에서는 게시판id로 정렬되게 되어있음) 엉망이 되고..
해서..
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT A.ID, A.NAME, A.DESCRIPTION, A.USE_YN, A.REG_USER
FROM
(
SELECT
AA.ID, AA.NAME, AA.DESCRIPTION, AA.USE_YN, AA.REG_USER, ROWNUM as RNUM
FROM
(
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER, ROWNUM
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) AA
WHERE ROWNUM BETWEEN 1 AND #firstIndex# + #recordCountPerPage#
) A
WHERE RNUM BETWEEN #firstIndex# AND #firstIndex# + #recordCountPerPage#
</select>
이와같이 하면 제대로 나오더군요..
확인해보시고.. 잘못된 부분이나.. 더 좋은 방법이 있으면 알려주셨으면 합니다~
그럼 수고하세요..
P.S : 게시판 내용칸이 작아 보기 힘들까봐 TXT파일로 질문글 그대로 붙여 첨부합니다.
첨부파일
A
안녕하세요.. 서동민님..
우선 배포 파일은 빠른 시일 안에 조치하도록 하겠습니다.
Oracle의 페이지 처리는 다음 처럼 정리하시면 될 것 같습니다.
SELECT * FROM ( SELECT rownum rn, TB.* FROM (
본 query...
) TB ) WHERE rn BETWEEN #firstIndex# + 1 AND #firstIndex# + #recordCountPerPage#
전체 query를 정리하면.. 다음과 같이 하시면 됩니다.
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT * FROM ( SELECT rownum rn, TB.* FROM (
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) TB ) WHERE rn BETWEEN #firstIndex# + 1 AND #firstIndex# + #recordCountPerPage#
</select>
그럼.. 즐거운 하루되십시오.
감사합니다.
우선 배포 파일은 빠른 시일 안에 조치하도록 하겠습니다.
Oracle의 페이지 처리는 다음 처럼 정리하시면 될 것 같습니다.
SELECT * FROM ( SELECT rownum rn, TB.* FROM (
본 query...
) TB ) WHERE rn BETWEEN #firstIndex# + 1 AND #firstIndex# + #recordCountPerPage#
전체 query를 정리하면.. 다음과 같이 하시면 됩니다.
<select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">
SELECT * FROM ( SELECT rownum rn, TB.* FROM (
SELECT
ID, NAME, DESCRIPTION, USE_YN, REG_USER
FROM SAMPLE
WHERE 1=1
<isEqual prepend="AND" property="searchCondition" compareValue="0">
ID = #searchKeyword#
</isEqual>
<isEqual prepend="AND" property="searchCondition" compareValue="1">
NAME LIKE '%' || #searchKeyword# || '%'
</isEqual>
ORDER BY ID DESC
) TB ) WHERE rn BETWEEN #firstIndex# + 1 AND #firstIndex# + #recordCountPerPage#
</select>
그럼.. 즐거운 하루되십시오.
감사합니다.