2017-01-17 7 views
2

я использовал 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.

ответ

0

В запросе критерии я не вижу информации рода я не написал бы так:

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

    List<Order> orders = new ArrayList<Order>(2); 
    orders.add(cb.asc(iRoot.get("name"))); 
    orders.add(cb.asc(iRoot.get("desc"))); 

    cq.orderBy(orders); 
    TypedQuery<User> query = em.createQuery(cq); 
    Page<User> result = new PageImpl<User>(query.getResultList(), page, totalRows); 

    return result; 

Я не проверял, но она должна работать

Angelo

+0

Но как сделать его динамичным? Это жестко закодировано в ваших кодах, и я полагаю, что страница будет автоматически сортироваться? – Javatar

+0

Pageable не будет сортировать автоматически; это должен быть запрос при этом. Если вы хотите, чтобы это динамически, вы должны передать заказ (или эквивалентный DTO) методу findByCriteria params –

+0

Спасибо, я нашел решение вручную, сделав сортировку с помощью Pageable, getSort(). – Javatar