Fix handling of null predicate in Specification.not().

When toPredicate() returns null, Specification.not() now returns
builder.disjunction() instead of builder.not(null). This change
ensures proper handling of null predicates in negated specifications.

Closes #3849
Original pull request: #3856

Signed-off-by: SWQXDBA <983110853@qq.com>
This commit is contained in:
SWQXDBA
2025-04-23 20:03:17 +08:00
committed by Mark Paluch
parent 17fef3ca8d
commit 2f47f22baa
2 changed files with 18 additions and 1 deletions

View File

@@ -56,7 +56,13 @@ public interface Specification<T> 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();
};
}
/**

View File

@@ -214,6 +214,17 @@ class SpecificationUnitTests {
verify(builder).or(firstPredicate, secondPredicate);
}
@Test // #3849
void notWithNullPredicate() {
Specification<Object> spec = (r, q, cb) -> null;
Specification<Object> notSpec = Specification.not(spec);
notSpec.toPredicate(root, query, builder);
verify(builder).disjunction();
}
static class SerializableSpecification implements Serializable, Specification<Object> {
@Override