From 24d69c5452ae1f4fcc89dc637fe94a92d39ef5a3 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 1 Dec 2021 10:47:15 +0800 Subject: [PATCH] Optimize SimpleJpaRepository.exists(Example) for better performance. 1. Set max results to 1 to avoid full scan 2. Select 1 to reduce size of ResultSet Original pull request #2368 --- .../data/jpa/repository/support/SimpleJpaRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java b/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java index f5f2fe1ef..adfc5e76b 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java @@ -530,8 +530,12 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation boolean exists(Example example) { - return !getQuery(new ExampleSpecification(example, escapeCharacter), example.getProbeType(), Sort.unsorted()) - .getResultList().isEmpty(); + Specification spec = new ExampleSpecification<>(example, this.escapeCharacter); + CriteriaQuery cq = this.em.getCriteriaBuilder().createQuery(Integer.class); + cq.select(this.em.getCriteriaBuilder().literal(1)); + applySpecificationToCriteria(spec, example.getProbeType(), cq); + TypedQuery query = applyRepositoryMethodMetadata(this.em.createQuery(cq)); + return query.setMaxResults(1).getSingleResult() != null; } /*