я использовал JPA CriteriaQuery построить свой динамический запрос и передать объект Spring Data выгружаемого:JPA CriteriaQuery реализует Spring Data Pageable.getSort()
sort=name,desc
На внутреннем интерфейсе у меня есть метод в моем хранилище для поддержки динамический запрос:
public Page<User> findByCriteria(String username, Pageable page) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> iRoot = cq.from(User.class);
List<Predicate> predicates = new ArrayList<Predicate>();
if (StringUtils.isNotEmpty(username)) {
predicates.add(cb.like(cb.lower(iRoot.<String>get("username")), "%" + username.toLowerCase() + "%"));
}
Predicate[] predArray = new Predicate[predicates.size()];
predicates.toArray(predArray);
cq.where(predArray);
TypedQuery<User> query = em.createQuery(cq);
int totalRows = query.getResultList().size();
query.setFirstResult(page.getPageNumber() * page.getPageSize());
query.setMaxResults(page.getPageSize());
Page<User> result = new PageImpl<User>(query.getResultList(), page, totalRows);
return result;
}
Примечание: Я поставил только один параметр для демонстрационной цели.
Однако возвращенные данные несортированы, поэтому я хотел бы спросить, что любой способ реализовать pageable в CriteriaQuery.
Но как сделать его динамичным? Это жестко закодировано в ваших кодах, и я полагаю, что страница будет автоматически сортироваться? – Javatar
Pageable не будет сортировать автоматически; это должен быть запрос при этом. Если вы хотите, чтобы это динамически, вы должны передать заказ (или эквивалентный DTO) методу findByCriteria params –
Спасибо, я нашел решение вручную, сделав сортировку с помощью Pageable, getSort(). – Javatar