EntityManager分页查询,多个参数
时间: 2023-07-06 15:11:47 浏览: 200
EntityManager提供了多种分页查询的方式,其中一种常用的方式是使用TypedQuery和CriteriaBuilder结合使用。
假设我们有一个实体类User,其中有三个属性:id、username和age。现在我们需要根据username和age进行分页查询,查询结果按照id升序排列。
以下是示例代码:
```java
public List<User> findUsersByPage(String username, int age, int pageNum, int pageSize) {
EntityManager entityManager = ...; // 获取EntityManager实例
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);
// 构建查询条件
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(username)) {
predicates.add(criteriaBuilder.like(root.get("username"), "%" + username + "%"));
}
if (age > 0) {
predicates.add(criteriaBuilder.equal(root.get("age"), age));
}
criteriaQuery.where(predicates.toArray(new Predicate[0]));
// 构建排序条件
criteriaQuery.orderBy(criteriaBuilder.asc(root.get("id")));
// 构建分页查询
TypedQuery<User> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult((pageNum - 1) * pageSize);
typedQuery.setMaxResults(pageSize);
// 执行查询并返回结果
return typedQuery.getResultList();
}
```
在上述代码中,我们首先获取了EntityManager实例,并获取了CriteriaBuilder实例。然后,我们构建了一个CriteriaQuery<User>对象,并指定实体类为User。接着,通过调用criteriaQuery.from(User.class)方法获取了Root<User>对象,并开始构建查询条件和排序条件。
在构建查询条件时,我们先创建了一个Predicate列表,并根据传入的参数构建Predicate。如果username不为空,则添加一个模糊查询的Predicate;如果age大于0,则添加一个等于查询的Predicate。最后,将Predicate列表转换成数组,并设置为查询条件。
在构建排序条件时,我们调用了orderBy方法,并指定按照id升序排列。
最后,我们通过创建TypedQuery<User>对象,并设置分页参数,执行查询并返回结果。
需要注意的是,在调用getResultList方法之前,我们还可以调用其他方法设置查询缓存、锁定查询结果等。详细使用方法可以参考JPA的相关文档。
阅读全文