jpa实现分页带条件查询
时间: 2023-08-27 21:04:46 浏览: 47
您可以使用 JPA 的 Criteria API 来实现带条件的分页查询。以下是一个示例代码:
```java
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
public class UserRepository {
private EntityManager entityManager;
public List<User> getUsersWithPaginationAndCondition(int page, int size, String name, int age) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);
Predicate predicate = criteriaBuilder.conjunction();
if (name != null && !name.isEmpty()) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("name"), name));
}
if (age > 0) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("age"), age));
}
criteriaQuery.where(predicate);
TypedQuery<User> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult((page - 1) * size);
typedQuery.setMaxResults(size);
return typedQuery.getResultList();
}
}
```
在上面的示例中,我们使用 CriteriaBuilder 构建 CriteriaQuery 对象,并通过 Root 对象指定要查询的实体类。然后,我们可以使用 CriteriaBuilder 来创建 Predicate 对象,根据条件来构建查询条件。
在此示例中,我们使用了两个条件:name 和 age。如果这些条件不为空或大于零,则将它们添加到 Predicate 中。
最后,我们通过 TypedQuery 设置分页参数,并执行查询。
请注意,上述代码只是一个示例,并且假设您已经具有合适的实体类 User 和 EntityManager 的实例。您需要根据自己的实际情况进行适当的调整。