From 5937880f2815e822d375f289684b77e7bd537e22 Mon Sep 17 00:00:00 2001 From: Ayk Borstelmann Date: Thu, 4 Jan 2024 18:24:11 +0100 Subject: [PATCH 1/2] Test JpaSpecificationExecutor for abstract and concrete type repositories --- ...edTypeJpaSpecificationIntegrationTest.java | 71 +++++++++++++++++++ .../sample/MappedTypeRepository.java | 4 +- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/MappedTypeJpaSpecificationIntegrationTest.java diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/MappedTypeJpaSpecificationIntegrationTest.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/MappedTypeJpaSpecificationIntegrationTest.java new file mode 100644 index 0000000000..c14e5b1bdc --- /dev/null +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/MappedTypeJpaSpecificationIntegrationTest.java @@ -0,0 +1,71 @@ +package org.springframework.data.jpa.repository; + +import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.jpa.domain.Specification.*; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.sample.AbstractMappedType; +import org.springframework.data.jpa.domain.sample.AbstractMappedType_; +import org.springframework.data.jpa.domain.sample.ConcreteType1; +import org.springframework.data.jpa.domain.sample.ConcreteType1_; +import org.springframework.data.jpa.repository.sample.ConcreteRepository1; +import org.springframework.data.jpa.repository.sample.MappedTypeRepository; +import org.springframework.data.jpa.repository.sample.SampleConfig; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = SampleConfig.class) +public class MappedTypeJpaSpecificationIntegrationTest { + + @Autowired + @Qualifier("concreteRepository1") private MappedTypeRepository mappedTypeRepository; + + @Autowired private ConcreteRepository1 concreteRepository1; + + @Test + void testUseMappedTypeRepository() { + concreteRepository1.save(new ConcreteType1("Test")); + + List findings = mappedTypeRepository.findAll(mappedTypeAttribute1Equals("Test")); + assertThat(findings).isNotEmpty(); + } + + @Test + void testUseConcreteRepository() { + concreteRepository1.save(new ConcreteType1("Test")); + + List findings = concreteRepository1 + .findAll(where(mappedTypeAttribute1Equals("Test"))); + assertThat(findings).isNotEmpty(); + } + + @Test + void testUseConcreteRepositoryAndCombineSpecifications() { + concreteRepository1.save(new ConcreteType1("Test")); + + List firstFindings = concreteRepository1 + .findAll(where(concreteTypeIdIsGreaterOrEqualThan0()).and(mappedTypeAttribute1Equals("Test"))); + List secondFindings = concreteRepository1 + .findAll(where(mappedTypeAttribute1Equals("Test")).and(concreteTypeIdIsGreaterOrEqualThan0())); + + assertThat(firstFindings).isEqualTo(secondFindings); + } + + private static Specification concreteTypeIdIsGreaterOrEqualThan0() { + return (root, query, criteriaBuilder) -> criteriaBuilder.greaterThan(root.get(ConcreteType1_.ID), 0); + } + + private static Specification mappedTypeAttribute1Equals(String attribute1) { + return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get(AbstractMappedType_.ATTRIBUTE1), + attribute1); + } +} diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/MappedTypeRepository.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/MappedTypeRepository.java index 12c1041ef4..da5b87bedb 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/MappedTypeRepository.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/MappedTypeRepository.java @@ -21,6 +21,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.sample.AbstractMappedType; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.query.Param; @@ -29,7 +30,8 @@ * @author Thomas Darimont */ @NoRepositoryBean -public interface MappedTypeRepository extends JpaRepository { +public interface MappedTypeRepository + extends JpaRepository, JpaSpecificationExecutor { @Query("select t from #{#entityName} t where t.attribute1=?1") List findAllByAttribute1(String attribute1); From 1acbc0af528045a117ddaf902dd5438ba1665958 Mon Sep 17 00:00:00 2001 From: Ayk Borstelmann Date: Thu, 4 Jan 2024 18:59:17 +0100 Subject: [PATCH 2/2] Allow Supertypes Specifications in JpaSpecificationExecutor --- .../QueryByExamplePredicateBuilder.java | 2 +- .../data/jpa/domain/Specification.java | 7 ++- .../jpa/domain/SpecificationComposition.java | 10 ++--- .../repository/JpaSpecificationExecutor.java | 17 +++---- .../query/KeysetScrollSpecification.java | 4 +- .../FetchableFluentQueryBySpecification.java | 18 ++++---- .../support/SimpleJpaRepository.java | 44 ++++++++++--------- .../jpa/domain/SpecificationUnitTests.java | 2 +- ...raphRepositoryMethodsIntegrationTests.java | 12 ++--- .../ParentRepositoryIntegrationTests.java | 6 +-- .../jpa/repository/UserRepositoryTests.java | 2 +- 11 files changed, 63 insertions(+), 61 deletions(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java index fc47f221ce..06e0df7331 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java @@ -93,7 +93,7 @@ public static Predicate getPredicate(Root root, CriteriaBuilder cb, Examp * @return {@literal null} indicates no constraints */ @Nullable - public static Predicate getPredicate(Root root, CriteriaBuilder cb, Example example, + public static Predicate getPredicate(Root root, CriteriaBuilder cb, Example example, EscapeCharacter escapeCharacter) { Assert.notNull(root, "Root must not be null"); 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 5f145adaa6..1e88decfb6 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 @@ -16,7 +16,6 @@ package org.springframework.data.jpa.domain; import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; @@ -77,7 +76,7 @@ static Specification where(@Nullable Specification spec) { * @return The conjunction of the specifications * @since 2.0 */ - default Specification and(@Nullable Specification other) { + default Specification and(@Nullable Specification other) { return SpecificationComposition.composed(this, other, CriteriaBuilder::and); } @@ -88,7 +87,7 @@ default Specification and(@Nullable Specification other) { * @return The disjunction of the specifications * @since 2.0 */ - default Specification or(@Nullable Specification other) { + default Specification or(@Nullable Specification other) { return SpecificationComposition.composed(this, other, CriteriaBuilder::or); } @@ -102,7 +101,7 @@ default Specification or(@Nullable Specification other) { * @return a {@link Predicate}, may be {@literal null}. */ @Nullable - Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder); + Predicate toPredicate(Root root, 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 f708fcef4b..5b33c706c4 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 @@ -15,13 +15,13 @@ */ package org.springframework.data.jpa.domain; -import java.io.Serializable; - import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; +import java.io.Serializable; + import org.springframework.lang.Nullable; /** @@ -40,7 +40,7 @@ interface Combiner extends Serializable { Predicate combine(CriteriaBuilder builder, @Nullable Predicate lhs, @Nullable Predicate rhs); } - static Specification composed(@Nullable Specification lhs, @Nullable Specification rhs, + static Specification composed(@Nullable Specification lhs, @Nullable Specification rhs, Combiner combiner) { return (root, query, builder) -> { @@ -57,8 +57,8 @@ static Specification composed(@Nullable Specification lhs, @Nullable S } @Nullable - private static Predicate toPredicate(@Nullable Specification specification, Root root, CriteriaQuery query, - CriteriaBuilder builder) { + private static Predicate toPredicate(@Nullable Specification specification, Root root, + 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 f04544f958..ca175a8c14 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 @@ -46,7 +46,7 @@ public interface JpaSpecificationExecutor { * @return never {@literal null}. * @throws org.springframework.dao.IncorrectResultSizeDataAccessException if more than one entity found. */ - Optional findOne(Specification spec); + Optional findOne(Specification spec); /** * Returns all entities matching the given {@link Specification}. @@ -54,7 +54,7 @@ public interface JpaSpecificationExecutor { * @param spec must not be {@literal null}. * @return never {@literal null}. */ - List findAll(Specification spec); + List findAll(Specification spec); /** * Returns a {@link Page} of entities matching the given {@link Specification}. @@ -63,7 +63,7 @@ public interface JpaSpecificationExecutor { * @param pageable must not be {@literal null}. * @return never {@literal null}. */ - Page findAll(Specification spec, Pageable pageable); + Page findAll(Specification spec, Pageable pageable); /** * Returns all entities matching the given {@link Specification} and {@link Sort}. @@ -72,7 +72,7 @@ public interface JpaSpecificationExecutor { * @param sort must not be {@literal null}. * @return never {@literal null}. */ - List findAll(Specification spec, Sort sort); + List findAll(Specification spec, Sort sort); /** * Returns the number of instances that the given {@link Specification} will return. @@ -80,7 +80,7 @@ public interface JpaSpecificationExecutor { * @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(Specification spec); /** * Checks whether the data store contains elements that match the given {@link Specification}. @@ -89,7 +89,7 @@ public interface JpaSpecificationExecutor { * @return {@code true} if the data store contains elements that match the given {@link Specification} otherwise * {@code false}. */ - boolean exists(Specification spec); + boolean exists(Specification spec); /** * Deletes by the {@link Specification} and returns the number of rows deleted. @@ -106,7 +106,7 @@ public interface JpaSpecificationExecutor { * @return the number of entities deleted. * @since 3.0 */ - long delete(Specification spec); + long delete(Specification spec); /** * Returns entities matching the given {@link Specification} applying the {@code queryFunction} that defines the query @@ -117,6 +117,7 @@ public interface JpaSpecificationExecutor { * @return all entities matching the given Example. * @since 3.0 */ - R findBy(Specification spec, Function, R> queryFunction); + R findBy(Specification spec, + Function, R> queryFunction); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/KeysetScrollSpecification.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/KeysetScrollSpecification.java index 6047c164ca..fa7da3c8a7 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/KeysetScrollSpecification.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/KeysetScrollSpecification.java @@ -42,7 +42,7 @@ * @author Christoph Strobl * @since 3.1 */ -public record KeysetScrollSpecification (KeysetScrollPosition position, Sort sort, +public record KeysetScrollSpecification(KeysetScrollPosition position, Sort sort, JpaEntityInformation entity) implements Specification { public KeysetScrollSpecification(KeysetScrollPosition position, Sort sort, JpaEntityInformation entity) { @@ -84,7 +84,7 @@ public static Sort createSort(KeysetScrollPosition position, Sort sort, JpaEntit } @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { return createPredicate(root, criteriaBuilder); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/FetchableFluentQueryBySpecification.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/FetchableFluentQueryBySpecification.java index 57bec8597e..dad7d96656 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/FetchableFluentQueryBySpecification.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/FetchableFluentQueryBySpecification.java @@ -52,25 +52,25 @@ class FetchableFluentQueryBySpecification extends FluentQuerySupport implements FluentQuery.FetchableFluentQuery { - private final Specification spec; + private final Specification spec; private final Function> finder; private final SpecificationScrollDelegate scroll; - private final Function, Long> countOperation; - private final Function, Boolean> existsOperation; + private final Function, Long> countOperation; + private final Function, Boolean> existsOperation; private final EntityManager entityManager; - public FetchableFluentQueryBySpecification(Specification spec, Class entityType, + public FetchableFluentQueryBySpecification(Specification spec, Class entityType, Function> finder, SpecificationScrollDelegate scrollDelegate, - Function, Long> countOperation, Function, Boolean> existsOperation, - EntityManager entityManager) { + Function, Long> countOperation, + Function, Boolean> existsOperation, EntityManager entityManager) { this(spec, entityType, (Class) entityType, Sort.unsorted(), 0, Collections.emptySet(), finder, scrollDelegate, countOperation, existsOperation, entityManager); } - private FetchableFluentQueryBySpecification(Specification spec, Class entityType, Class resultType, + private FetchableFluentQueryBySpecification(Specification spec, Class entityType, Class resultType, Sort sort, int limit, Collection properties, Function> finder, - SpecificationScrollDelegate scrollDelegate, Function, Long> countOperation, - Function, Boolean> existsOperation, EntityManager entityManager) { + SpecificationScrollDelegate scrollDelegate, Function, Long> countOperation, + Function, Boolean> existsOperation, EntityManager entityManager) { super(resultType, sort, limit, properties, entityType); this.spec = spec; 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 31abc19187..e4458bad22 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 @@ -427,7 +427,7 @@ public Page findAll(Pageable pageable) { } @Override - public Optional findOne(Specification spec) { + public Optional findOne(Specification spec) { try { return Optional.of(getQuery(spec, Sort.unsorted()).setMaxResults(2).getSingleResult()); @@ -437,12 +437,12 @@ public Optional findOne(Specification spec) { } @Override - public List findAll(Specification spec) { + public List findAll(Specification spec) { return getQuery(spec, Sort.unsorted()).getResultList(); } @Override - public Page findAll(Specification spec, Pageable pageable) { + public Page findAll(Specification spec, Pageable pageable) { TypedQuery query = getQuery(spec, pageable); return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) @@ -450,12 +450,12 @@ public Page findAll(Specification spec, Pageable pageable) { } @Override - public List findAll(Specification spec, Sort sort) { + public List findAll(Specification spec, Sort sort) { return getQuery(spec, sort).getResultList(); } @Override - public boolean exists(Specification spec) { + public boolean exists(Specification spec) { CriteriaQuery cq = this.entityManager.getCriteriaBuilder() // .createQuery(Integer.class) // @@ -468,7 +468,7 @@ public boolean exists(Specification spec) { } @Override - public long delete(Specification spec) { + public long delete(Specification spec) { CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); CriteriaDelete delete = builder.createCriteriaDelete(getDomainClass()); @@ -485,7 +485,7 @@ public long delete(Specification spec) { } @Override - public R findBy(Specification spec, Function, R> queryFunction) { + public R findBy(Specification spec, Function, R> queryFunction) { Assert.notNull(spec, "Specification must not be null"); Assert.notNull(queryFunction, "Query function must not be null"); @@ -493,7 +493,7 @@ public R findBy(Specification spec, Function R doFindBy(Specification spec, Class domainClass, + private R doFindBy(Specification spec, Class domainClass, Function, R> queryFunction) { Assert.notNull(spec, "Specification must not be null"); @@ -501,7 +501,7 @@ private R doFindBy(Specification spec, Class domainClass, ScrollQueryFactory scrollFunction = (sort, scrollPosition) -> { - Specification specToUse = spec; + Specification specToUse = spec; if (scrollPosition instanceof KeysetScrollPosition keyset) { KeysetScrollSpecification keysetSpec = new KeysetScrollSpecification<>(keyset, sort, entityInformation); @@ -604,7 +604,7 @@ public long count() { } @Override - public long count(@Nullable Specification spec) { + public long count(@Nullable Specification spec) { return executeCountQuery(getCountQuery(spec, getDomainClass())); } @@ -687,7 +687,7 @@ protected Page readPage(TypedQuery query, Pageable pageable, @Nullable Spe * @param pageable can be {@literal null}. */ protected Page readPage(TypedQuery query, final Class domainClass, Pageable pageable, - @Nullable Specification spec) { + @Nullable Specification spec) { if (pageable.isPaged()) { query.setFirstResult(PageableUtils.getOffsetAsInteger(pageable)); @@ -704,7 +704,7 @@ protected Page readPage(TypedQuery query, final Class dom * @param spec can be {@literal null}. * @param pageable must not be {@literal null}. */ - protected TypedQuery getQuery(@Nullable Specification spec, Pageable pageable) { + protected TypedQuery getQuery(@Nullable Specification spec, Pageable pageable) { Sort sort = pageable.isPaged() ? pageable.getSort() : Sort.unsorted(); return getQuery(spec, getDomainClass(), sort); @@ -717,7 +717,7 @@ protected TypedQuery getQuery(@Nullable Specification spec, Pageable pagea * @param domainClass must not be {@literal null}. * @param pageable must not be {@literal null}. */ - protected TypedQuery getQuery(@Nullable Specification spec, Class domainClass, + protected TypedQuery getQuery(@Nullable Specification spec, Class domainClass, Pageable pageable) { Sort sort = pageable.isPaged() ? pageable.getSort() : Sort.unsorted(); @@ -730,7 +730,7 @@ protected TypedQuery getQuery(@Nullable Specification spec, * @param spec can be {@literal null}. * @param sort must not be {@literal null}. */ - protected TypedQuery getQuery(@Nullable Specification spec, Sort sort) { + protected TypedQuery getQuery(@Nullable Specification spec, Sort sort) { return getQuery(spec, getDomainClass(), sort); } @@ -741,12 +741,13 @@ protected TypedQuery getQuery(@Nullable Specification spec, Sort sort) { * @param domainClass must not be {@literal null}. * @param sort must not be {@literal null}. */ - protected TypedQuery getQuery(@Nullable Specification spec, Class domainClass, Sort sort) { + protected TypedQuery getQuery(@Nullable Specification spec, Class domainClass, + Sort sort) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(domainClass); - Root root = applySpecificationToCriteria(spec, domainClass, query); + Root root = applySpecificationToCriteria(spec, domainClass, query); query.select(root); if (sort.isSorted()) { @@ -773,7 +774,8 @@ protected TypedQuery getCountQuery(@Nullable Specification spec) { * @param spec can be {@literal null}. * @param domainClass must not be {@literal null}. */ - protected TypedQuery getCountQuery(@Nullable Specification spec, Class domainClass) { + protected TypedQuery getCountQuery(@Nullable Specification spec, + Class domainClass) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(Long.class); @@ -814,8 +816,8 @@ protected QueryHints getQueryHintsForCount() { * @param domainClass must not be {@literal null}. * @param query must not be {@literal null}. */ - private Root applySpecificationToCriteria(@Nullable Specification spec, Class domainClass, - CriteriaQuery query) { + private Root applySpecificationToCriteria(@Nullable Specification spec, + Class domainClass, CriteriaQuery query) { Assert.notNull(domainClass, "Domain class must not be null"); Assert.notNull(query, "CriteriaQuery must not be null"); @@ -942,7 +944,7 @@ private static final class ByIdsSpecification implements Specification { } @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { Path path = root.get(entityInformation.getIdAttribute()); parameter = (ParameterExpression>) (ParameterExpression) cb.parameter(Collection.class); @@ -981,7 +983,7 @@ private static class ExampleSpecification implements Specification { } @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { return QueryByExamplePredicateBuilder.getPredicate(root, cb, example, escapeCharacter); } } 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 aeb0c819ea..23d47d3340 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 @@ -217,7 +217,7 @@ void orCombinesSpecificationsInOrder() { static class SerializableSpecification implements Serializable, Specification { @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { return null; } } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EntityGraphRepositoryMethodsIntegrationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EntityGraphRepositoryMethodsIntegrationTests.java index 1086577a21..566f448f0a 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EntityGraphRepositoryMethodsIntegrationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EntityGraphRepositoryMethodsIntegrationTests.java @@ -15,9 +15,9 @@ */ package org.springframework.data.jpa.repository; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assumptions.assumeThat; -import static org.springframework.data.jpa.support.EntityManagerTestUtils.currentEntityManagerIsAJpa21EntityManager; +import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assumptions.*; +import static org.springframework.data.jpa.support.EntityManagerTestUtils.*; import jakarta.persistence.EntityManager; import jakarta.persistence.Persistence; @@ -37,7 +37,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.sample.QUser; import org.springframework.data.jpa.domain.sample.Role; import org.springframework.data.jpa.domain.sample.User; @@ -192,7 +191,7 @@ void shouldRespectConfiguredJpaEntityGraphWithPaginationAndSpecification() { em.clear(); Page page = repository.findAll( // - (Specification) this::firstNameIsNotNull, // + this::firstNameIsNotNull, // PageRequest.of(0, 100) // ); @@ -285,7 +284,8 @@ void shouldCreateDynamicGraphWithMultipleLevelsOfSubgraphs() { softly.assertAll(); } - private Predicate firstNameIsNotNull(Root root, CriteriaQuery __, CriteriaBuilder criteriaBuilder) { + private Predicate firstNameIsNotNull(Root root, CriteriaQuery __, + CriteriaBuilder criteriaBuilder) { return criteriaBuilder.isNotNull(root.get(User_.firstname)); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java index 6b85895950..06dd3673f3 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java @@ -15,7 +15,7 @@ */ package org.springframework.data.jpa.repository; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -67,7 +67,7 @@ void testWithoutJoin() { Page page = repository.findAll(new Specification() { @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { Path> childrenPath = root.get("children"); query.distinct(true); return cb.isNotEmpty(childrenPath); @@ -88,7 +88,7 @@ void testWithJoin() { Page page = repository.findAll(new Specification() { @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { root.join("children"); // we are interesting in distinct items, especially when join presents in query query.distinct(true); 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 54496092b5..e62ad264d7 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 @@ -933,7 +933,7 @@ void doesNotDropNullValuesOnPagedSpecificationExecution() { Page page = repository.findAll(new Specification() { @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { return cb.equal(root.get("lastname"), "Gierke"); } }, PageRequest.of(0, 20, Sort.by("manager.lastname")));