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.
This commit is contained in:
Oliver Gierke
2016-06-02 12:37:36 +02:00
parent d06ec589db
commit 068a5d52f1
2 changed files with 25 additions and 8 deletions

View File

@@ -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<? extends Object> 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<? extends Object> complete(Predicate predicate, Sort sort,
CriteriaQuery<? extends Object> query, CriteriaBuilder builder, Root<?> root) {

View File

@@ -67,10 +67,7 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<? extend
super(tree);
Class<?> typeToRead = type.getTypeToRead();
CriteriaQuery<? extends Object> criteriaQuery = typeToRead == null ? builder.createTupleQuery()
: builder.createQuery(typeToRead);
CriteriaQuery<? extends Object> criteriaQuery = createCriteriaQuery(builder, type);
this.builder = builder;
this.query = criteriaQuery.distinct(tree.isDistinct());
@@ -79,6 +76,20 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<? extend
this.returnedType = type;
}
/**
* Creates the {@link CriteriaQuery} to apply predicates on.
*
* @param builder will never be {@literal null}.
* @param type will never be {@literal null}.
* @return must not be {@literal null}.
*/
protected CriteriaQuery<? extends Object> 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<CriteriaQuery<? extend
return new PredicateBuilder(part, root).build();
}
private <T> Expression<T> 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.
*