如何使用标准和分页

时间:2018-09-10 15:03:40

标签: java spring-boot pagination criteria

嗨,我正在尝试使用标准和分页,但我的代码无法正常工作,这里是:

[]

一切似乎都很好,但是当我执行它时,我会收到一个列表页面,其中包含所有结果,而不仅仅是我的pageRequest中指定的结果

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您没有使用寻呼请求:

  

列表列表= query.getResultList();

此查询将始终查询效率非常低的所有结果。

相反,您应该以 Spring方式 进行此操作,即应该使用扩展了PagingAndSortingRepository的存储库接口(例如JpaRepository接口)。 / p>

然后只需使用一种方法来对结果进行分页,例如documentation中所述的findAll:

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

答案 1 :(得分:1)

谓词数组和where子句看起来正确定义。在这些行中:

  

谓词谓词= criteriaBuilder.like(root.get(“ name”),   “%[myValue]%”);       queryConditions.add(predicate);

queryBase.where(queryConditions.toArray(new Predicate[]{}));

TypedQuery<Person> query = em.createQuery(queryBase);

只是提醒。也许您需要criteriaBuilder.equal而不是criteriaBuilder.like。如果您确定自己做了什么,则可以忽略此提醒。

您需要更改以下几行:

query.setFirstResult(Math.toIntExact(pageRequest.getOffset()));
query.setMaxResults(pageRequest.getPageSize());

return new PageImpl<Person>(query.getResultList(), pageRequest, getTotalCount(criteriaBuilder, queryConditions));

然后添加getTotalCount方法以保持一致性。

private Long getTotalCount(CriteriaBuilder criteriaBuilder, Predicate[] predicateArray) {
        CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
        Root<T> root = criteriaQuery.from(entityType);

        criteriaQuery.select(criteriaBuilder.count(root));
        criteriaQuery.where(predicateArray);

        return entityManager.createQuery(criteriaQuery).getSingleResult();
    }