AbstractDAO에서 findListWithPaging 함수가 pagingSQLGenerator를 인식하지 못합니다.
Submitted by sunys99 on 화, 05/11/2010 - 08:09
AbstractDAO의 한수중 findListWithPaging를 사용해서 Paging처리를 하고자 했습니다.
DB는 MySql를 사용하므로 MySqlPagingSQLGenerator 를 만들어서 context-query.xml 파일에
기존에
bean id="pagingSQLGenerator"
class="anyframe.core.query.impl.jdbc.generator.OraclePagingSQLGenerator" 와 같은 기존 파일을
bean id="pagingSQLGenerator"
class="com.sds.test.MySqlPagingSQLGenerator" 로 수정했습니다.
테스트 결과 find()함수는 정상적으로 pagingSQLGenerator 인식했으나 findWithRowCount() 함수는 해당
pagingSQLGenerator 를 인식하지 못하는것을 확인했습니다. 조언 바랍니다.


MySQLPagingSQLGenerator 구현 방법입니다.
아래 같은 형태로 MySQLPagingSQLGenerator를 개발한 후 테스트하여 보시기 바랍니다.
이 코드는 테스트가 되지 않아 일부 에러가 있을 수 있습니다. 계속 문제가 발생되면 다시
문의하여 주시기 바랍니다.
package anyframe.generator; import java.sql.Types; import anyframe.core.query.impl.jdbc.generator.AbstractPagingSQLGenerator; public class MySQLPagingSQLGenerator extends AbstractPagingSQLGenerator { @Override public String getCountSQL(String originalSql) { StringBuffer sql = new StringBuffer("SELECT count(*) FROM ( "); sql.append(originalSql); sql.append(" ) COUNT_TABLE "); return sql.toString(); } public String getPaginationSQL(String originalSql, Object[] originalArgs, int[] originalArgTypes, int pageIndex, int pageSize) { // 정의된 기본 쿼리문을 ROWNUM을 이용한 형태로 변경하기 위해 앞,뒤로 문자열 추가 String sql = new StringBuffer(originalSql.length() + 20).append( originalSql).append(" limit ?, ?").toString(); // 쿼리문에 입력되어야 할 기본 입력 인자 외에 // 페이징 처리를 위한 pageIndex, pageSize 인자값 셋팅 setQueryArgs(originalArgs, pageIndex, pageSize); // 쿼리문에 입력되어야 할 기본 입력 인자 외에 // 페이징 처리를 위한 pageIndex, pageSize 인자 타입 셋팅 setQueryArgTypes(originalArgTypes); // 변경된 쿼리문 전달 return sql.toString(); } protected void setQueryArgs(Object[] originalArgs, int pageIndex, int pageSize) { Object[] args = new Object[originalArgs.length + 2]; for (int i = 0; i < originalArgs.length; i++) { args[i] = originalArgs[i]; } args[originalArgs.length] = String.valueOf(new Long((pageIndex - 1) * pageSize + 1)); args[originalArgs.length + 1] = String.valueOf(new Long(pageIndex * pageSize)); setArgs(args); } protected void setQueryArgTypes(int[] originalArgTypes) { int[] argTypes = new int[originalArgTypes.length + 2]; for (int i = 0; i < originalArgTypes.length; i++) { argTypes[i] = originalArgTypes[i]; } argTypes[originalArgTypes.length] = Types.INTEGER; argTypes[originalArgTypes.length + 1] = Types.INTEGER; setArgTypes(argTypes); } }문제는 MySQLPagingSQLGenerator 구현 방법을 모르는게 아니라 ..
제 질문이 불 명확했나 보네요. 문제의 요지는 "MySQLPagingSQLGenerator 구현 방법" 이 아니라
AbstractDAO.findListWithPaging() 이 새로 생성한 PagingSQLGenerator를 사용하지 않는다는 겁니다.
AbstractDAO.find() <-- 정상적 PagingSQLGenerator 수행
AbstractDAO.findWithRowCount() <-- PagingSQLGenerator 수행 하지 않음.
꼭 MySql이 아니라도 Oracle이 아닌 다른 PagingSQLGenerator를 사용하셔서 테스트해 보시면
확인이 가능 하실 겁니다.
위에 제가 제공한 코드를 가지고 mysql
위에 제가 제공한 코드를 가지고 mysql 5.0.82과 Anyframe 4.x에서 위에 언급한 AbstractDAO.findListWithPaging()메소드를 테스하여 정상적으로 동작하고 있음을 확인했습니다. MySQLPagingSQLGenerator코드가 테스트 과정에서 일부 오류가 발견되어 위 코드 다시 수정하였으니 참조하시기 바랍니다. 그리고 저희가 제공하고 있는 AbstractDAO는 find()와 findWithRowCount() 메소드는 제공하고 있지 않습니다. 이 메소드는 QueryService에만 존재합니다. 확인하여 보시기 바랍니다.
AbstractDAO.java 파일 1101 line findListWidthPaging
AbstractDAO.java 파일 1101line 보면 아래와 같은 함수가 있습니다.
protected Page findListWithPaging(String tableName, Object[] targetObjs,
int pageIndex, int pageSize, int pageUnit)
throws QueryServiceException {
Map queryMap = null;
queryMap =
queryService.findWithRowCount(findPrefix + tableName
+ findListPostfix, targetObjs, pageIndex, pageSize);
List resultList = (List) queryMap.get(IQueryService.LIST);
int totalSize = ((Long) queryMap.get(IQueryService.COUNT)).intValue();
return new Page(resultList, (new Integer(pageIndex)).intValue(),
totalSize, pageUnit, pageSize);
}
AbsctracDAO가 외부적으로 findWithRowCount()를 제공하지는 않지만 findListWithPaging() 함수 구현을 위해서
내부적으로 queryService.findWithRowCount() 함수를 사용하고있는 것을 볼수 있습니다.
현제 저는 Anyframe template를 수정해가면서 작업을 하고 있습니다.
QueryService쪽에 findIIO 함수는 context-query.xml에 선언해 놓은 pagingSQLGenerator를 정상적으로 참조합니다.
그러나
QueryService쪽에 findWithRowCount() 함수는 pagingSQLGenerator를 정상적으로 참조하지 못하고 있습니다.
그로인해 findWithRowCount()함수를 내부적으로 사용한는 AbsctracDAO.findListWithPaging()가 정상 동작하지 않습니다.
확인 부탁 드립니다.
결론적으로 보면
결론적으로 보면 queryService.findWithRowCount(findPrefix + tableName + findListPostfix, targetObjs, pageIndex, pageSize)를 실행한 경우, Oracle은 동작하는데, Mysql은 동작하지 않다고 하는게 맞는지요?
그리고, 현재 사용중인 Anyframe 버전을 알려주셨으면 합니다.
AnyframeCore 3.2.1 입니다.
약간 다른데 Oracle이외에 새로 만들어서 추가된 pagingSQLGenerator 클래스를
queryService.findWithRowCount(findPrefix + tableName + findListPostfix, targetObjs, pageIndex, pageSize)이 함수가
참조하지 못하는듯 합니다.
위에 만들어진 코드를 가지고 Generator를
위에 만들어진 코드를 가지고 Generator를 만드셨는지요?
queryService.findWithRowCount(..)를 가지고 실행했을 때, Console에 출력된 내용을 복사하여 보내주시기 바랍니다.
그리고 관련 테스트 코드와 spring bean을 정의하고 있는 xml파일, sql mapping xml 파일을 보내주시기 바랍니다.
첫 등록된 글의 하단에 있는 편집 기능을 이용하면 파일을 첨부할 수 있습니다.
anyframe@samsung.com 로 메일 발송했습니다.
파일 추가가 아니라 입력란에 xml파일을 쓰려고 하니 입력이 잘 되지 않아서
상기의 주소로 관련 파일들을 메일로 보냈습니다.
테스트 파일은 없고 관련 xml들과 DAOImpl.java파일을 같이 보냈습니다.
AbstractDAO를 상속받아 구현된
AbstractDAO를 상속받아 구현된 ProductDAOImpl에서 queryService를 injection하는 부분이 주석으로 처리되어 상위 메소드에서 queryService 접근시 NullPointerException이 발생하고 있습니다. 다음 부분의 주석을 풀어준 후 처리하시기 바랍니다.
// @Resource
// private IQueryService queryService;
//
// @PostConstruct
// public void initialize() {
// setQueryService(this.queryService);
// }
//
드디어 됍니다.!!!! 감격!ㅠ
드디어 됍니다.!!^^ 제가 만든 파일이 문제가 있었나 봅니다. 아놔 이 감격.ㅋ
이것 때문에 오래동안 끙끙 앓았었는데 정말 감사합니다. 친절하고 빠른답변
정말 감사 드립니다~^^