diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java index 635cd0d19..462a02ea7 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java @@ -96,12 +96,12 @@ public interface Specification extends Serializable { * {@link Root} and {@link CriteriaQuery}. * * @param root must not be {@literal null}. - * @param query must not be {@literal null}. + * @param query can be {@literal null} to allow overrides that accept {@link jakarta.persistence.criteria.CriteriaDelete} which is an {@link jakarta.persistence.criteria.AbstractQuery} but no {@link CriteriaQuery}. * @param criteriaBuilder must not be {@literal null}. * @return a {@link Predicate}, may be {@literal null}. */ @Nullable - Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder); + Predicate toPredicate(Root root, @Nullable CriteriaQuery query, CriteriaBuilder criteriaBuilder); /** * Applies an AND operation to all the given {@link Specification}s. diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/SpecificationComposition.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/SpecificationComposition.java index f708fcef4..9b0654bd7 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/SpecificationComposition.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/SpecificationComposition.java @@ -57,7 +57,7 @@ class SpecificationComposition { } @Nullable - private static Predicate toPredicate(@Nullable Specification specification, Root root, CriteriaQuery query, + private static Predicate toPredicate(@Nullable Specification specification, Root root, @Nullable CriteriaQuery query, CriteriaBuilder builder) { return specification == null ? null : specification.toPredicate(root, query, builder); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/JpaSpecificationExecutor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/JpaSpecificationExecutor.java index f04544f95..0d38cc580 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/JpaSpecificationExecutor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/JpaSpecificationExecutor.java @@ -28,6 +28,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.data.repository.query.FluentQuery; +import org.springframework.lang.Nullable; /** * Interface to allow execution of {@link Specification}s based on the JPA criteria API. @@ -50,37 +51,45 @@ public interface JpaSpecificationExecutor { /** * Returns all entities matching the given {@link Specification}. + *

+ * If no {@link Specification} is given all entities matching {@code } will be selected. * - * @param spec must not be {@literal null}. + * @param spec can be {@literal null}. * @return never {@literal null}. */ - List findAll(Specification spec); + List findAll(@Nullable Specification spec); /** * Returns a {@link Page} of entities matching the given {@link Specification}. + *

+ * If no {@link Specification} is given all entities matching {@code } will be selected. * - * @param spec must not be {@literal null}. + * @param spec can be {@literal null}. * @param pageable must not be {@literal null}. * @return never {@literal null}. */ - Page findAll(Specification spec, Pageable pageable); + Page findAll(@Nullable Specification spec, Pageable pageable); /** * Returns all entities matching the given {@link Specification} and {@link Sort}. + *

+ * If no {@link Specification} is given all entities matching {@code } will be selected. * - * @param spec must not be {@literal null}. + * @param spec can be {@literal null}. * @param sort must not be {@literal null}. * @return never {@literal null}. */ - List findAll(Specification spec, Sort sort); + List findAll(@Nullable Specification spec, Sort sort); /** * Returns the number of instances that the given {@link Specification} will return. + *

+ * If no {@link Specification} is given all entities matching {@code } will be counted. * * @param spec the {@link Specification} to count instances for, must not be {@literal null}. * @return the number of instances. */ - long count(Specification spec); + long count(@Nullable Specification spec); /** * Checks whether the data store contains elements that match the given {@link Specification}. @@ -101,12 +110,14 @@ public interface JpaSpecificationExecutor { * {@link Specification#toPredicate(Root, CriteriaQuery, CriteriaBuilder)} will be {@literal null} because * {@link jakarta.persistence.criteria.CriteriaBuilder#createCriteriaDelete(Class)} does not implement * {@code CriteriaQuery}. + *

+ * If no {@link Specification} is given all entities matching {@code } will be deleted. * - * @param spec the {@link Specification} to use for the existence check, must not be {@literal null}. + * @param spec the {@link Specification} to use for the existence check, can not be {@literal null}. * @return the number of entities deleted. * @since 3.0 */ - long delete(Specification spec); + long delete(@Nullable Specification spec); /** * Returns entities matching the given {@link Specification} applying the {@code queryFunction} that defines the query diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java index a261064cc..a2aaf3478 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java @@ -431,7 +431,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation(findAll()); } - return findAll((root, query, criteriaBuilder) -> null, pageable); + return findAll((Specification) null, pageable); } @Override @@ -450,7 +450,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation findAll(Specification spec, Pageable pageable) { + public Page findAll(@Nullable Specification spec, Pageable pageable) { TypedQuery query = getQuery(spec, pageable); return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) @@ -458,7 +458,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation findAll(Specification spec, Sort sort) { + public List findAll(@Nullable Specification spec, Sort sort) { return getQuery(spec, sort).getResultList(); } @@ -477,7 +477,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation spec) { + public long delete(@Nullable Specification spec) { CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); CriteriaDelete delete = builder.createCriteriaDelete(getDomainClass());