2012-05-23 80 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