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 ea626af59..249da0815 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 @@ -55,7 +55,13 @@ public interface Specification extends Serializable { return spec == null // ? (root, query, builder) -> null // - : (root, query, builder) -> builder.not(spec.toPredicate(root, query, builder)); + : (root, query, builder) -> { + Predicate predicate = spec.toPredicate(root, query, builder); + if(predicate != null) { + return builder.not(predicate); + } + return builder.disjunction(); + }; } /** diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/SpecificationUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/SpecificationUnitTests.java index 96f193b42..992ecdd51 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/SpecificationUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/SpecificationUnitTests.java @@ -214,6 +214,17 @@ class SpecificationUnitTests implements Serializable { verify(builder).or(firstPredicate, secondPredicate); } + @Test // #3849 + void notWithNullPredicate() { + Specification spec = (r, q, cb) -> null; + + Specification notSpec = Specification.not(spec); + + notSpec.toPredicate(root, query, builder); + + verify(builder).disjunction(); + } + static class SerializableSpecification implements Serializable, Specification { @Override