独特的结果和与多对多关系的分页

时间:2012-05-23 17:01:19

标签: java hibernate

我有一个M-to-M关系从提名到用户映射在“Nominee”表上。我有以下方法将结果封装在名为“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?

1 个答案:

答案 0 :(得分:0)

我用于此问题的解决方案是首先查询仅加载满足条件的根实体的ID(即25个提名的ID),然后发出第二个查询来加载数据这些25个ID,通过执行如下查询

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