From f8450c61dfa24f1748986489790151b4deb31bf0 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 2 Jun 2016 12:37:36 +0200 Subject: [PATCH] DATAJPA-909 - Fixed count query execution for projections and pagination. We now make sure that the count query for derived queries using pagination uses a plain count projection and does not try to apply that on a tuple query. --- .../query/JpaCountQueryCreator.java | 10 ++++++++ .../jpa/repository/query/JpaQueryCreator.java | 23 ++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java index ff111fc83..6eeb3eac3 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java @@ -45,11 +45,21 @@ public class JpaCountQueryCreator extends JpaQueryCreator { super(tree, type, builder, provider); } + /* + * (non-Javadoc) + * @see org.springframework.data.jpa.repository.query.JpaQueryCreator#createCriteriaQuery(javax.persistence.criteria.CriteriaBuilder, org.springframework.data.repository.query.ReturnedType) + */ + @Override + protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { + return builder.createQuery(type.getDomainType()); + } + /* * (non-Javadoc) * @see org.springframework.data.jpa.repository.query.JpaQueryCreator#complete(javax.persistence.criteria.Predicate, org.springframework.data.domain.Sort, javax.persistence.criteria.CriteriaQuery, javax.persistence.criteria.CriteriaBuilder, javax.persistence.criteria.Root) */ @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) protected CriteriaQuery complete(Predicate predicate, Sort sort, CriteriaQuery query, CriteriaBuilder builder, Root root) { diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index f498040cc..e2ef5f5cb 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -67,10 +67,7 @@ public class JpaQueryCreator extends AbstractQueryCreator typeToRead = type.getTypeToRead(); - - CriteriaQuery criteriaQuery = typeToRead == null ? builder.createTupleQuery() - : builder.createQuery(typeToRead); + CriteriaQuery criteriaQuery = createCriteriaQuery(builder, type); this.builder = builder; this.query = criteriaQuery.distinct(tree.isDistinct()); @@ -79,6 +76,20 @@ public class JpaQueryCreator extends AbstractQueryCreator createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { + + Class typeToRead = type.getTypeToRead(); + + return typeToRead == null ? builder.createTupleQuery() : builder.createQuery(typeToRead); + } + /** * Returns all {@link javax.persistence.criteria.ParameterExpression} created when creating the query. * @@ -169,10 +180,6 @@ public class JpaQueryCreator extends AbstractQueryCreator Expression getTypedPath(Root root, Part part) { - return toExpressionRecursively(root, part.getProperty()); - } - /** * Simple builder to contain logic to create JPA {@link Predicate}s from {@link Part}s. *