0

我有一个从 Nomination 到 User 的 M 对 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 个用户。

我能得到一些帮助吗?让我知道是否需要澄清。

如果有的话,这是与我的问题最接近的问题:如何在休眠中检索不同的根实体行数?

4

1 回答 1

0

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

select n from Nomination n 
[... joins and fetches] 
where n.id in (:ids)
于 2012-05-23T17:08:39.377 回答