2012-05-23 29 views
0

我有一個M-to-M關係從提名到用戶映射到「代名人」表上。我有以下方法來將結果封裝在名爲「ResultPage」的分頁類中:不同的結果和分頁與多對多關係

protected ResultPage<T> findPageByCriteria(Criteria criteria, int page, 
               int pageSize) { 
     DataVerify.notNull(criteria); 
     DataVerify.greaterThan(page, 0, "Invalid page number"); 
     DataVerify.isTrue(pageSize >= 0, "Invalid page size"); 
     if (logger.isDebugEnabled()) { 
      logger.debug("Arguments: "); 
      logger.debug("Page: " + page); 
      logger.debug("Page size: " + pageSize); 
     } 
     int totalItems = 0; 
     List<T> results = null; 
     if (pageSize != 0) { 
      totalItems = ((Number) criteria.setProjection(Projections.rowCount()). 
        uniqueResult()).intValue(); 
      criteria.setProjection(null); 

      criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
      criteria.addOrder(Order.desc("id")); 

      results = criteria.setFirstResult((page-1) * pageSize). 
        setMaxResults(pageSize).list(); 
     } else { 
      results = criteria.setFirstResult((page-1) * pageSize). 
        list(); 
      totalItems = results.size(); 
     } 

     ResultPage<T> resultsPage = new ResultPage<T>(results, page, 
       totalItems, 
       (pageSize != 0) ? pageSize : 
         totalItems); 
     if (logger.isDebugEnabled()){ 
      logger.debug("Total Results: " + resultsPage.getTotalItems()); 
     } 
     return resultsPage; 
    } 

現在抓取工作正確完成。但是我的結果數量並不一致。這當然只有當「提名」有超過1個用戶分配給它時纔會發生。然後它計算用戶而不是根實體,因此我得到的每頁總數爲「1到22」,而不像我指定的那樣是「1到25」 - 好像有22個提名但總共25個用戶。

我能爲此得到一些幫助嗎?如果我需要澄清,請告訴我。

如果有的話這件事是因爲最近我的問題的問題:how to retrieve distinct root entity row count in hibernate?

回答

0

我用這個問題的解決方案是第一個查詢只加載根實體符合標準的ID(即你的25項提名的ID),然後發出它加載這25個ID的數據,做一個查詢類似以下

select n from Nomination n 
[... joins and fetches] 
where n.id in (:ids) 
+0

子查詢是最接受的解決方案,我的疑問是第二查詢有點複雜,所以我想我會看到我可以更好地進行子查詢。 – Nimchip