Spring Data JPA中,可以使用 **Specification** **Criteria** 来实现多条件查询。

    首先,需要定义一个 **Specification** 接口,该接口包含一个 **toPredicate** 方法,用于构建查询条件。
    例如,以下是一个使用 **Specification** 实现根据用户ID和用户名查询的示例:

    1. public class UserSpecification {
    2. public static Specification<User> withUserIdAndUserName(Long userId, String userName) {
    3. return (root, query, criteriaBuilder) -> {
    4. List<Predicate> predicates = new ArrayList<>();
    5. if (userId != null) {
    6. predicates.add(criteriaBuilder.equal(root.get("id"), userId));
    7. }
    8. if (userName != null) {
    9. predicates.add(criteriaBuilder.like(root.get("name"), "%" + userName + "%"));
    10. }
    11. return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
    12. };
    13. }
    14. }

    在上面的示例中,**Specification** 接口的 **toPredicate** 方法返回一个 **Predicate** 对象,它包含了根据用户ID和用户名查询的条件。
    第 3 行:root 表示查询的根对象,query 表示查询的对象,criteriaBuilder 表示构建查询条件的工厂。

    然后,在 **UserRepository** 接口中定义一个方法,该方法使用上述 **Specification** 接口来实现多条件查询。
    例如,以下是一个使用 **Specification** 实现多条件查询的示例:

    1. public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    2. List<User> findAll(Specification<User> specification);
    3. }

    在上面的示例中,**UserRepository** 接口继承了 **JpaSpecificationExecutor** 接口,该接口定义了 **findAll(Specification<T> spec)** 方法,该方法使用 **Specification** 接口来实现多条件查询。

    最后,在调用 **UserRepository** 接口的 **findAll** 方法时,可以传入一个 **Specification** 对象来实现多条件查询。
    例如,以下是一个使用 **UserSpecification** 实现多条件查询的示例:

    1. List<User> users = userRepository.findAll(UserSpecification.withUserIdAndUserName(1L, "John"));