簡體   English   中英

如何使用標准和分頁

[英]How to use Criteria And pagination

大家好,我正在嘗試使用標准和分頁,但是我的代碼無法正常工作,這里是:

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中指定的結果

我究竟做錯了什么 ?

您沒有使用分頁請求:

清單清單= query.getResultList();

此查詢將始終查詢效率非常低的所有結果。

相反,您應該以Spring方式執行此操作,即您應該使用擴展PagingAndSortingRepository的存儲庫接口(例如JpaRepository接口)。

然后只需按照文檔中的說明使用一種方法對結果進行分頁,例如findAll:

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

謂詞數組和where子句看起來正確定義。 在這些行中:

謂詞predicate =條件Builder.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();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM