在Spring Data JPA中,可以使用 **Specification** 和 **Criteria** 来实现多条件查询。
首先,需要定义一个 **Specification** 接口,该接口包含一个 **toPredicate** 方法,用于构建查询条件。
例如,以下是一个使用 **Specification** 实现根据用户ID和用户名查询的示例:
public class UserSpecification {public static Specification<User> withUserIdAndUserName(Long userId, String userName) {return (root, query, criteriaBuilder) -> {List<Predicate> predicates = new ArrayList<>();if (userId != null) {predicates.add(criteriaBuilder.equal(root.get("id"), userId));}if (userName != null) {predicates.add(criteriaBuilder.like(root.get("name"), "%" + userName + "%"));}return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));};}}
在上面的示例中,**Specification** 接口的 **toPredicate** 方法返回一个 **Predicate** 对象,它包含了根据用户ID和用户名查询的条件。
第 3 行:root 表示查询的根对象,query 表示查询的对象,criteriaBuilder 表示构建查询条件的工厂。
然后,在 **UserRepository** 接口中定义一个方法,该方法使用上述 **Specification** 接口来实现多条件查询。
例如,以下是一个使用 **Specification** 实现多条件查询的示例:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {List<User> findAll(Specification<User> specification);}
在上面的示例中,**UserRepository** 接口继承了 **JpaSpecificationExecutor** 接口,该接口定义了 **findAll(Specification<T> spec)** 方法,该方法使用 **Specification** 接口来实现多条件查询。
最后,在调用 **UserRepository** 接口的 **findAll** 方法时,可以传入一个 **Specification** 对象来实现多条件查询。
例如,以下是一个使用 **UserSpecification** 实现多条件查询的示例:
List<User> users = userRepository.findAll(UserSpecification.withUserIdAndUserName(1L, "John"));
