大家好,我正在尝试使用条件和分页,但我的代码不起作用,这里是:
public Page<Person> getAuthorizationsTest() {
PageRequest pageRequest = new PageRequest(1, 5);
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Person> queryBase = criteriaBuilder.createQuery(Person.class);
Root<Person> root = queryBase.from(Person.class);
List<Predicate> queryConditions = new ArrayList<>();
Predicate predicate = criteriaBuilder.like(root.get("name"), "%[myValue]%");
queryConditions.add(predicate);
queryBase.where(queryConditions.toArray(new Predicate[]{}));
TypedQuery<Person> query = em.createQuery(queryBase);
List<Person> list = query.getResultList();
Page<Person> authorizations = new PageImpl<Person>(list, pageRequest, list.size());
return authorizations;
}
一切看起来都很好,但是当我执行它时,我收到一个包含所有结果的列表页面,而不仅仅是我的 pageRequest 中指定的结果
我做错了什么?
最佳答案
谓词数组和 where 子句看起来定义正确。在这些行中:
Predicate predicate = 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();
}
关于java - 如何使用条件和分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52260666/