diff --git a/pom.xml b/pom.xml index ca8ee5b81e..eca6f44c01 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-jpa-parent - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT pom Spring Data JPA Parent diff --git a/spring-data-envers/pom.xml b/spring-data-envers/pom.xml index 8e2de43f59..7d13dd251b 100755 --- a/spring-data-envers/pom.xml +++ b/spring-data-envers/pom.xml @@ -5,12 +5,12 @@ org.springframework.data spring-data-envers - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT org.springframework.data spring-data-jpa-parent - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT ../pom.xml diff --git a/spring-data-jpa-distribution/pom.xml b/spring-data-jpa-distribution/pom.xml index bba8571672..195ae84b60 100644 --- a/spring-data-jpa-distribution/pom.xml +++ b/spring-data-jpa-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-jpa-parent - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT ../pom.xml diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml index ba9220cc2a..34640acd65 100644 --- a/spring-data-jpa/pom.xml +++ b/spring-data-jpa/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-jpa - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT Spring Data JPA Spring Data module for JPA repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-jpa-parent - 3.0.0-SNAPSHOT + 3.0.0-gh-2054-SNAPSHOT ../pom.xml 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 4dd01244fb..0da11e318b 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 @@ -308,6 +308,13 @@ protected QueryHints getQueryHints() { return metadata == null ? NoHints.INSTANCE : DefaultQueryHints.of(entityInformation, metadata); } + /** + * Returns {@link QueryHints} with the query hints on the current {@link CrudMethodMetadata} for count queries. + */ + protected QueryHints getQueryHintsForCount() { + return metadata == null ? NoHints.INSTANCE : DefaultQueryHints.of(entityInformation, metadata).forCounts(); + } + @Deprecated @Override public T getOne(ID id) { @@ -749,7 +756,7 @@ protected TypedQuery getCountQuery(@Nullable Specification TypedQuery applyRepositoryMethodMetadataForCount(TypedQuery query) { + + if (metadata == null) { + return query; + } + + applyQueryHintsForCount(query); + + return query; + } + + private void applyQueryHintsForCount(Query query) { + getQueryHintsForCount().forEach(query::setHint); + } + /** * Executes a count query and transparently sums up all values returned. * diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java index cc69535d33..ebbc549041 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java @@ -18,9 +18,7 @@ import static java.util.Collections.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; - -import java.util.Arrays; -import java.util.Optional; +import static org.springframework.data.jpa.domain.Specification.*; import jakarta.persistence.EntityGraph; import jakarta.persistence.EntityManager; @@ -28,6 +26,9 @@ import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; +import java.util.Arrays; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -192,4 +193,14 @@ void doNothingWhenNonExistentInstanceGetsDeleted() { verify(em, never()).remove(newUser); verify(em, never()).merge(newUser); } + + @Test // GH-2054 + void applyQueryHintsToCountQueriesForSpecificationPageables() { + + when(query.getResultList()).thenReturn(Arrays.asList(new User(), new User())); + + repo.findAll(where(null), PageRequest.of(2, 1)); + + verify(metadata).getQueryHintsForCount(); + } }