From 2df06bd7367e8c376c6e4ba19694d446eb7a1448 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 2 Jun 2023 14:35:31 +0200 Subject: [PATCH] Polishing. Reuse comment hint retrieval. Reorder methods. Inline methods and use fluent API where possible. See #2991 Original pull request: #2995 --- .../support/SimpleJpaRepository.java | 92 +++++++++++-------- 1 file changed, 52 insertions(+), 40 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 f48d9c3bc..e9a2d4b20 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 @@ -38,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -230,9 +231,11 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation implements JpaRepositoryImplementation hints = new HashMap<>(); - - getQueryHints().withFetchGraphs(em).forEach(hints::put); - - if (metadata != null && metadata.getComment() != null && provider.getCommentHintKey() != null) { - hints.put(provider.getCommentHintKey(), provider.getCommentHintValue(metadata.getComment())); - } + Map hints = getHints(); return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints)); } - /** - * Returns {@link QueryHints} with the query hints based on the current {@link CrudMethodMetadata} and potential - * {@link EntityGraph} information. - */ - 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) { @@ -437,7 +418,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation findAll(Pageable pageable) { - if (isUnpaged(pageable)) { + if (pageable.isUnpaged()) { return new PageImpl<>(findAll()); } @@ -463,7 +444,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation findAll(Specification spec, Pageable pageable) { TypedQuery query = getQuery(spec, pageable); - return isUnpaged(pageable) ? new PageImpl<>(query.getResultList()) + return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) : readPage(query, getDomainClass(), pageable, spec); } @@ -475,9 +456,12 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation spec) { - CriteriaQuery cq = this.em.getCriteriaBuilder().createQuery(Integer.class); - cq.select(this.em.getCriteriaBuilder().literal(1)); + CriteriaQuery cq = this.em.getCriteriaBuilder() // + .createQuery(Integer.class) // + .select(this.em.getCriteriaBuilder().literal(1)); + applySpecificationToCriteria(spec, getDomainClass(), cq); + TypedQuery query = applyRepositoryMethodMetadata(this.em.createQuery(cq)); return query.setMaxResults(1).getResultList().size() == 1; } @@ -565,9 +549,12 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation boolean exists(Example example) { Specification spec = new ExampleSpecification<>(example, this.escapeCharacter); - CriteriaQuery cq = this.em.getCriteriaBuilder().createQuery(Integer.class); - cq.select(this.em.getCriteriaBuilder().literal(1)); + CriteriaQuery cq = this.em.getCriteriaBuilder() // + .createQuery(Integer.class) // + .select(this.em.getCriteriaBuilder().literal(1)); + applySpecificationToCriteria(spec, example.getProbeType(), cq); + TypedQuery query = applyRepositoryMethodMetadata(this.em.createQuery(cq)); return query.setMaxResults(1).getResultList().size() == 1; } @@ -590,7 +577,7 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation probeType = example.getProbeType(); TypedQuery query = getQuery(new ExampleSpecification<>(example, escapeCharacter), probeType, pageable); - return isUnpaged(pageable) ? new PageImpl<>(query.getResultList()) : readPage(query, probeType, pageable, spec); + return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) : readPage(query, probeType, pageable, spec); } @Override @@ -804,6 +791,21 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation implements JpaRepositoryImplementation TypedQuery applyRepositoryMethodMetadataForCount(TypedQuery query) { @@ -878,9 +877,26 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation getHints() { + + Map hints = new HashMap<>(); + + getQueryHints().withFetchGraphs(em).forEach(hints::put); + + if (metadata != null) { + applyComment(metadata, hints::put); + } + + return hints; + } + + private void applyComment(CrudMethodMetadata metadata, BiConsumer consumer) { if (metadata.getComment() != null && provider.getCommentHintKey() != null) { - query.setHint(provider.getCommentHintKey(), provider.getCommentHintValue(metadata.getComment())); + consumer.accept(provider.getCommentHintKey(), provider.getCommentHintValue(this.metadata.getComment())); } } @@ -903,10 +919,6 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation