From a66f67506a52a4ee3493cf9c9302627c4167bba6 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 21 Mar 2023 11:35:53 +0100 Subject: [PATCH] Leniently accept null when calling delete(Specification). Closes #2796 --- .../support/SimpleJpaRepository.java | 15 ++++------ .../jpa/repository/UserRepositoryTests.java | 28 +++++++++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) 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 dfb77272d..38ea619fa 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 @@ -15,12 +15,7 @@ */ package org.springframework.data.jpa.repository.support; -import static org.springframework.data.jpa.repository.query.QueryUtils.COUNT_QUERY_STRING; -import static org.springframework.data.jpa.repository.query.QueryUtils.DELETE_ALL_QUERY_BY_ID_STRING; -import static org.springframework.data.jpa.repository.query.QueryUtils.DELETE_ALL_QUERY_STRING; -import static org.springframework.data.jpa.repository.query.QueryUtils.applyAndBind; -import static org.springframework.data.jpa.repository.query.QueryUtils.getQueryString; -import static org.springframework.data.jpa.repository.query.QueryUtils.toOrders; +import static org.springframework.data.jpa.repository.query.QueryUtils.*; import jakarta.persistence.EntityManager; import jakarta.persistence.LockModeType; @@ -524,10 +519,12 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation delete = builder.createCriteriaDelete(getDomainClass()); - Predicate predicate = spec.toPredicate(delete.from(getDomainClass()), null, builder); + if (spec != null) { + Predicate predicate = spec.toPredicate(delete.from(getDomainClass()), null, builder); - if (predicate != null) { - delete.where(predicate); + if (predicate != null) { + delete.where(predicate); + } } return this.em.createQuery(delete).executeUpdate(); diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index cb27a695f..c27667bf2 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -33,7 +33,14 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import lombok.Data; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Stream; import org.assertj.core.api.SoftAssertions; @@ -47,7 +54,14 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.domain.*; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.ExampleMatcher; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; import org.springframework.data.jpa.domain.Specification; @@ -594,6 +608,16 @@ public class UserRepositoryTests { assertThat(repository.findAll((Specification) null, pageable)).isEqualTo(repository.findAll(pageable)); } + @Test // GH-2796 + void removesAllIfSpecificationIsNull() { + + flushTestUsers(); + + repository.delete((Specification) null); + + assertThat(repository.count()).isEqualTo(0L); + } + @Test void returnsAllAsPageIfNoPageableIsGiven() {