我使用了JPA CriteriaQuery来构建我的动态查询,并将Spring Data Pageable对象传递进去:
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;
}
注意:我只为演示目的放置了一个参数。然而,返回的数据是未排序的,因此我想问是否有办法在CriteriaQuery中实现Pageable。
答案:
注意:我只为演示目的放置了一个参数。
然而,返回的数据是未排序的,因此我想问是否有办法在CriteriaQuery中实现Pageable。
CriteriaQuery cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(User.class)));
Long totalRows = entityManager.createQuery(cq).getSingleResult();
计算总行数的方法如上所示。首先,我们创建一个CriteriaQuery<Long>
对象,并使用cb.createQuery(Long.class)
进行初始化。然后,我们使用cq.select(cb.count(cq.from(User.class)))
来选择并计算User
类的总行数。最后,我们通过entityManager.createQuery(cq).getSingleResult()
执行查询,并将结果存储在totalRows
变量中。 - Shashikant Sharma