java JPA CriteriaQuery 实现 Spring Data Pageable.getSort()

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/41692097/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 06:03:42  来源:igfitidea点击:

JPA CriteriaQuery implements Spring Data Pageable.getSort()

javaspringhibernatespring-data-jpajpa-criteria

提问by Javatar

I used JPA CriteriaQuery to build my dynamic Query and pass in a Spring Data Pageable object:

我使用 JPA CriteriaQuery 来构建我的动态查询并传入一个 Spring Data Pageable 对象:

sort=name,desc

At the backend I have a method in my Repository to support dynamic query:

在后端,我的存储库中有一个方法来支持动态查询:

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

Note: I put only one param for demo purpose.

注意:为了演示目的,我只放了一个参数。

However the returned data is unsorted therefore I would like to ask is that any way to implement Pageable in CriteriaQuery.

然而,返回的数据是未排序的,因此我想问的是在 CriteriaQuery 中实现 Pageable 的任何方式。

回答by Angelo Immediata

In your criteria query i see no sort information I'd write in this way:

在您的标准查询中,我看不到我会以这种方式编写的排序信息:

     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;

I didn't test it but it should work

我没有测试它,但它应该工作

Angelo

安杰洛

回答by Konrad Pocz?tek

You can add sorting using QueryUtils from spring: query.orderBy(QueryUtils.toOrders(pageable.getSort(), root, builder));

您可以从 spring 使用 QueryUtils 添加排序: query.orderBy(QueryUtils.toOrders(pageable.getSort(), root, builder));