2017-11-24 6 views
0

간단한 질문처럼 보이지만 온라인으로 해결 방법을 찾지 못했습니다. 내가 뭘하는지는 계정으로 사용자를 얻는 DAO 메소드를 작성하는 것이다. 필자는 쿼리를 필터링하고 정렬하기위한 매개 변수를 포함합니다. 관련된 테이블이 여러 개 있고 내 쿼리에서 내부 조인, 왼쪽 외부 조인을 사용합니다 ... 중요하지 않습니다. 중요한 것은 제한 후 (제한에 관계없이 합계)에도 쿼리가 반환하는 행의 수를 알고 싶습니다. 이 .. 내 방법 내부의 코드JdbcTemplate을 사용하여 쿼리에서 반환 된 행 수를 가져옵니다.

내 쿼리에 추가 할 수있는 무엇
 List<User> users = new ArrayList<User>(); 

     UserRowCallbackHandler userHandler = new UserRowCallbackHandler(accountId); 

     String query = null; 

     if (limit == -1) { 
      query = String.format("%s\nORDER BY %s", 
        sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"), 
        orderBy); 
     } else { 
      query = String.format("%s\nORDER BY %s \nLIMIT %d, %d\n", 
        sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"), 
        orderBy, offset, limit); 
     } 


     getJdbcTemplate().query(
       query, userHandler, 
       accountId, filter); 

     users.addAll(userHandler.getUsers()); 

(또는 내 JbdcTemplate 객체 활용할 수있는 방법)도 제한 후, 내 쿼리 반환 총 행의 수를 볼을 ??

답변

0

좋아, 나는 내 솔루션에 만족스럽지 않지만 지금은 효과가있다. 그 대답은 3 가지 쿼리를 실행해야한다는 것인데, 그다지 문제는 아니지만 단일 쿼리 만 실행하는 것이 좋을 것입니다.

대답은 제한없이 초기 쿼리를 실행하고 즉시 (SELECT FOUND_ROWS()) 두 번째 쿼리를 실행하는 것입니다. 그런 다음 제한이 지정된 세 번째 쿼리를 실행합니다. 나는 제한이 없다면 두 개의 쿼리 만 실행하면되지만 서버 측 페이지 매김을하기 위해 이것을 사용하고 있으므로 거의 항상 한계가있을 것입니다. 코드는 다음과 같습니다.

 UserRowCallbackHandler userHandler = new UserRowCallbackHandler(accountId); 

     query = String.format("%s\nORDER BY %s", 
       sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"), 
       orderBy); 

     queryForTotal = "SELECT FOUND_ROWS()"; 

     getJdbcTemplate().query(
       query, 
       userHandler, accountId, filter); 

     filteredTotal = getJdbcTemplate().queryForInt(queryForTotal); 

     if (limit != -1) { 
      // re-initialize handler for clean data 
      userHandler = new UserRowCallbackHandler(accountId); 

      query = String.format("%s\nORDER BY %s \nLIMIT %d, %d\n", 
        sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"), 
        orderBy, offset, limit); 


      getJdbcTemplate().query(
        query, 
        userHandler, accountId, filter); 
     }