если вы хотите получить результат и количество всех элементов, таких как Page -элемент Spring Data, вы можете сделать два запроса.Что вы можете сделать, это отделить критерии от выполнения запроса.
Пример поиска пользователей по городу
public List<User> getUsers(int userid, String city, other values ...) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> q = cb.createQuery(User.class);
Root<User> c = q.from(User.class);
List<Predicate> conditions = createConditions(c, cb, userid, city, ...other values);
List<User> users = em.createQuery(q.select(c).where(conditions.toArray(new Predicate[] {})).distinct(true))
.setMaxResults(PAGE_ELEMENTS).setFirstResult(page * PAGE_ELEMENTS).getResultList();
return users;
}
Кроме метода getUser вы можете создать секунду, которая будет подсчитывать ваши элементы
public Long getElemCount(int userid, String city, ...other values) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
Root<Location> root = q.from(Location.class);
List<Predicate> conditions = createConditions(root, cb, userid, page, city, filter, module, isActive);
Long userCount = em.createQuery(q.select(cb.count(root)).where(conditions.toArray(new Predicate[] {})).distinct(true))
.getSingleResult();
return userCount;
}
, а метод createConditions будетобрабатывать оба, так что вам не нужно дублировать свою логику для критериев.
<T> List<Predicate> createConditions(Root<T> root, CriteriaBuilder cb, int userid, String city, ... other values) {
Join<User, SecondEntity> usr = root.join("someField");
// add joins as you wish
/*
* Build Conditions
*/
List<Predicate> conditions = new ArrayList<>();
conditions.add(cb.equal(root.get("id"), userid));
if (!city.equals("")) {
conditions.add(cb.like(...));
}
// some more conditions...
return conditions;
}
в вашем контроллере вы можете сделать что-то вроде
long elementCount = yourCriteriaClassInstance.getElementCount (...);Список пользователей = yourCriteriaClassInstance.getUsers (...)