Spring Data JPA系列JpaSpecificationExecutor用法详解
JpaSpecificationExecutor介绍
JpaSpecificationExecutor
是Spring Data JPA提供的一个接口,可以用于对JPA规范中Criteria Query
查询标准的扩展,使得我们可以根据不同的查询条件,动态生成不同的查询语句。
JpaSpecificationExecutor
接口中定义了如下几个方法:
T findOne(Specification<T> spec);
List<T> findAll(Specification<T> spec);
Page<T> findAll(Specification<T> spec, Pageable pageable);
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);
其中Specification
就是用于封装查询条件的对象,可以在其中动态构建查询语句。
使用示例
1、查询单个实体
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User>{
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findOneUser(String name, String password) {
Specification<User> specification = new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(name)) {
predicates.add(criteriaBuilder.equal(root.get("name"), name));
}
if (StringUtils.isNotBlank(password)) {
predicates.add(criteriaBuilder.equal(root.get("password"), password));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
}
};
return userRepository.findOne(specification).orElse(null);
}
}
上述代码中,我们定义了一个UserRepository
接口,并继承JpaSpecificationExecutor
接口,这样就可以在接口中直接使用Specification
来进行查询。接着在UserService
中,我们根据传入的查询条件,动态构建Specification
对象,并将其传入findOne()
方法中进行查询。
2、分页查询实体列表
public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
}
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public Page<Order> findAllOrders(Long customerId, String productName, Integer pageNum, Integer pageSize) {
Specification<Order> specification = new Specification<Order>() {
@Override
public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (customerId != null) {
predicates.add(criteriaBuilder.equal(root.get("customer").get("id"), customerId));
}
if (StringUtils.isNotBlank(productName)) {
predicates.add(criteriaBuilder.like(root.get("product").get("name"), "%" + productName + "%"));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
}
};
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
return orderRepository.findAll(specification, pageable);
}
}
上述代码中,我们定义了一个OrderRepository
接口,并继承JpaSpecificationExecutor
接口,同时在OrderService
中,我们根据传入的查询条件,动态构建Specification
对象,然后将其和分页参数一起传入findAll()
方法中进行查询。
总结
以上就是JpaSpecificationExecutor
的使用方法,我们可以通过动态构建Specification
对象来实现根据不同查询条件生成不同的查询语句。此外,在Specification
中还可以使用join
等高级查询语句来满足更为复杂的查询需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Data JPA系列JpaSpecificationExecutor用法详解 - Python技术站