我有一个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?
答案 0 :(得分:0)
我用于此问题的解决方案是首先查询仅加载满足条件的根实体的ID(即25个提名的ID),然后发出第二个查询来加载数据这些25个ID,通过执行如下查询
select n from Nomination n
[... joins and fetches]
where n.id in (:ids)