JPA CriteriaQuery实现了Spring Data Pageable.getSort() [英] JPA CriteriaQuery implements Spring Data Pageable.getSort()
本文介绍了JPA CriteriaQuery实现了Spring Data Pageable.getSort()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用JPA CriteriaQuery来构建我的动态查询并传递一个Spring Data Pageable对象:
pre $ sort $ name,desc
在后端,我在我的Repository中有一个方法来支持动态查询:
public Page< User> findByCriteria(字符串用户名,可分页页面){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery< User> cq = cb.createQuery(User.class);
Root< User> iRoot = cq.from(User.class);
列表<谓词> 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());
页面<用户> result = new PageImpl< User>(query.getResultList(),page,totalRows);
返回结果;
}
注意:我只提供了一个用于演示的参数。
然而,返回的数据是未排序的,因此我想问的是任何在CriteriaQuery中实现Pageable的方法。
在您的标准查询中,我看不到任何排序信息我会这样写:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery< User> cq = cb.createQuery(User.class);
Root< User> iRoot = cq.from(User.class);
列表<谓词> 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);
列表< 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);
页<使用者> result = new PageImpl< User>(query.getResultList(),page,totalRows);
返回结果;
我没有测试它,但应该可以工作
I used JPA CriteriaQuery to build my dynamic Query and pass in a Spring Data Pageable object:
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.
解决方案
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
这篇关于JPA CriteriaQuery实现了Spring Data Pageable.getSort()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文