在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"));