Spring JPA使用Specification进行动态查询

在Spring JPA使用CriteriaBuilder动态构造查询中,我们大致看了使用CriteriaBuilder如何进行动态查询。如果你已经熟悉了CriteriaBuilder,那么使用Specification就非常简单了。

  1. 创建repository,并继承JpaSpecificationExecutor。
public interface UserRepository extends JpaSpecificationExecutor<User> {}

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作为参数。
2、调用方式
假设我们获取性别为M的User:

  • 构造Specification
class findAllUser implements Specification<User> {
    @Override
    public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
        return cb.equal(root.get("gender"), "M");
    }
}

UserRepository.findAll(findAllUser);

Specification中就只有一个方法,该方法返回Predicate。

  • 直接传递方法
UserRepository.findAll((root, query, cb) -> cb.equal(root.get("gender"),"M"))

你可能感兴趣的:(SpringBoot,mysql,spring,jpa)