Как использовать критерии и нумерацию страниц - PullRequest
0 голосов
/ 10 сентября 2018

Привет, ребята. Я пытаюсь использовать критерии наряду с нумерацией страниц, но мой код не работает, вот он:

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;
}

Все выглядит нормально, но когда я его выполняю, я получаю страницу со списком со всеми результатами, а не только с теми, которые указаны в моем запросе страницы.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Массив предиката и выражение where выглядят правильно определенными. В этих строках:

Предикат-предикат = attributeBuilder.like (root.get ("name"), "% [MyValue]%"); queryConditions.add (предикат);

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();
    }
0 голосов
/ 10 сентября 2018

Вы не используете пейджинговый запрос:

Список списка = query.getResultList ();

Этот запрос всегда будет запрашивать все результаты, что очень неэффективно.

Вместо этого вы должны сделать это Spring way , т.е. вы должны использовать интерфейс репозитория, который расширяет PagingAndSortingRepository (такой как интерфейс JpaRepository).

Затем просто используйте метод разбивки ваших результатов на страницы, например findAll, как указано в документации :

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