springboot整合jpa条件分页查询
时间: 2025-07-09 07:52:19 浏览: 14
### 使用Spring Boot JPA 实现带条件的分页查询
在Spring Boot应用程序中,通过集成JPA可以方便地执行复杂的数据库操作。为了实现带有条件的分页查询,通常会结合`Specification`接口和`Pageable`对象来构建动态查询逻辑[^1]。
#### 创建实体类
假设有一个名为`User`的实体类表示用户表:
```java
@Entity
public class User {
@Id
private Long id;
private String name;
private Integer age;
// getters and setters...
}
```
#### 定义仓库接口
定义一个继承自`JpaRepository`以及`JpaSpecificationExecutor`的仓库接口用于处理基本CRUD操作和支持复杂查询:
```java
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long>, JpaSpecificationExecutor<User> {}
```
#### 构建规格化查询(Specification)
创建服务层方法,在其中利用`Specifications.where()`静态工厂方法组合多个查询条件,并传入`PageRequest.of(pageNumber, pageSize)`作为分页参数:
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Page<User> getUsersByConditions(String name, Integer minAge, int pageNumber, int pageSize){
Specification<User> spec = (root, criteriaQuery, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if(name != null && !name.isEmpty()){
predicates.add(cb.like(root.get("name"), "%" + name + "%"));
}
if(minAge != null){
predicates.add(cb.ge(root.<Integer>get("age"), minAge));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
Sort sort = Sort.by(Direction.ASC, "id");
Pageable pageable = PageRequest.of(pageNumber - 1, pageSize, sort);
return userRepository.findAll(spec,pageable);
}
}
```
此代码片段展示了如何基于给定的名字模糊匹配与最小年龄范围筛选符合条件的数据记录并返回指定页面的结果集。注意这里使用的是0索引为基础的`pageNumber`,所以在调用时需要减去1转换成实际请求的页码。
阅读全文
相关推荐




















