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:
@@ -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) {
|
||||
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user