2017-01-17 11 views
2

春データPageable.getSortを()を実装します動的クエリ:JPA CriteriaQueryは、私は私の動的なクエリを構築し、春データページング可能オブジェクトに渡すためにJPA CriteriaQueryを使用

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

注:デモ用のパラメータは1つだけです。

しかし、返されるデータはソートされていないため、私は、CriteriaQueryでPageableを実装する方法は何でもあります。

私はこのように書くと思います何のソート情報 を見ていない、あなたの基準で

答えて

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; 

私はそれをテストしていないが、それは

アンジェロ

+0

を動作するはずですしかし、どのようにそれを動的にする?それはあなたのコードでハードコードされていると私はPageableは自動的にソートを行うだろうと思いますか? – Javatar

+0

Pageableは自動的にソートを行いません。それを行う際にはクエリでなければなりません。あなたがdinamicallyしたい場合は、Order(または同等のDTO)メソッドに渡す必要がありますfindByCriteria params –

+0

ありがとう、私は手動でPageable、getSort()を使用してソートを行うことによって解決策を見つけました。 – Javatar

関連する問題