java - 如何使用条件和分页

标签 java spring-boot pagination criteria

大家好,我正在尝试使用条件和分页,但我的代码不起作用,这里是:

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/

相关文章:

php - Laravel 分页错误

javascript - $index 对于所有使用 dir-paginate 的页面都是固定的

java - 启用具有 JWT 安全性的 Spring Boot 2.0 Actuator 端点

java - 在 jackson 中禁用数字到字符串的自动转换

java - 无法覆盖 Spring Boot 安全性

php - 如何在 Laravel 中限制页面链接数?

java - Jersey 2 请求过滤器在此代码中不起作用

java - Spring 4 - 服务器启动后的运行方法

java - 这是装饰器模式还是策略模式,还是两者都不是?

java - 从列表中删除重复的条目并保留最后更新的条目 LocalDate