Merge remote branch 'origin/master'
This commit is contained in:
@@ -179,7 +179,7 @@
|
||||
|
||||
<entry><code>findByAgeOrderByLastnameDesc</code></entry>
|
||||
|
||||
<entry><code>… where x.age > ?1 order by x.lastname
|
||||
<entry><code>… where x.age = ?1 order by x.lastname
|
||||
desc</code></entry>
|
||||
</row>
|
||||
|
||||
|
||||
@@ -19,9 +19,10 @@ import javax.persistence.EntityManager;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Predicate;
|
||||
import javax.persistence.criteria.Root;
|
||||
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.repository.query.SimpleParameterAccessor;
|
||||
import org.springframework.data.repository.query.ParameterAccessor;
|
||||
import org.springframework.data.repository.query.parser.PartTree;
|
||||
|
||||
|
||||
@@ -32,9 +33,6 @@ import org.springframework.data.repository.query.parser.PartTree;
|
||||
*/
|
||||
public class JpaCountQueryCreator extends JpaQueryCreator {
|
||||
|
||||
private final Class<?> domainClass;
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link JpaCountQueryCreator}.
|
||||
*
|
||||
@@ -43,12 +41,10 @@ public class JpaCountQueryCreator extends JpaQueryCreator {
|
||||
* @param domainClass
|
||||
* @param em
|
||||
*/
|
||||
public JpaCountQueryCreator(PartTree tree,
|
||||
SimpleParameterAccessor parameters, Class<?> domainClass,
|
||||
EntityManager em) {
|
||||
public JpaCountQueryCreator(PartTree tree, ParameterAccessor parameters,
|
||||
Class<?> domainClass, EntityManager em) {
|
||||
|
||||
super(tree, parameters, domainClass, em);
|
||||
this.domainClass = domainClass;
|
||||
}
|
||||
|
||||
|
||||
@@ -56,16 +52,17 @@ public class JpaCountQueryCreator extends JpaQueryCreator {
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.data.jpa.repository.query.JpaQueryCreator#finalize
|
||||
* 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.CriteriaBuilder,
|
||||
* javax.persistence.criteria.Root)
|
||||
*/
|
||||
@Override
|
||||
protected CriteriaQuery<Object> complete(Predicate predicate, Sort sort,
|
||||
CriteriaQuery<Object> query, CriteriaBuilder builder) {
|
||||
CriteriaQuery<Object> query, CriteriaBuilder builder, Root<?> root) {
|
||||
|
||||
return query.select(builder.count(query.from(domainClass)));
|
||||
return query.select(builder.count(root));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package org.springframework.data.jpa.repository.query;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
@@ -26,8 +28,7 @@ import javax.persistence.criteria.Predicate;
|
||||
import javax.persistence.criteria.Root;
|
||||
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.repository.query.SimpleParameterAccessor;
|
||||
import org.springframework.data.repository.query.SimpleParameterAccessor.BindableParameterIterator;
|
||||
import org.springframework.data.repository.query.ParameterAccessor;
|
||||
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
|
||||
import org.springframework.data.repository.query.parser.Part;
|
||||
import org.springframework.data.repository.query.parser.PartTree;
|
||||
@@ -56,7 +57,7 @@ public class JpaQueryCreator extends
|
||||
* @param domainClass
|
||||
* @param em
|
||||
*/
|
||||
public JpaQueryCreator(PartTree tree, SimpleParameterAccessor parameters,
|
||||
public JpaQueryCreator(PartTree tree, ParameterAccessor parameters,
|
||||
Class<?> domainClass, EntityManager em) {
|
||||
|
||||
super(tree, parameters);
|
||||
@@ -73,11 +74,10 @@ public class JpaQueryCreator extends
|
||||
* @see
|
||||
* org.springframework.data.repository.query.parser.AbstractQueryCreator
|
||||
* #create(org.springframework.data.repository.query.parser.Part,
|
||||
* org.springframework
|
||||
* .data.repository.query.SimpleParameterAccessor.BindableParameterIterator)
|
||||
* java.util.Iterator)
|
||||
*/
|
||||
@Override
|
||||
protected Predicate create(Part part, BindableParameterIterator iterator) {
|
||||
protected Predicate create(Part part, Iterator<Object> iterator) {
|
||||
|
||||
return toPredicate(part, root, iterator);
|
||||
}
|
||||
@@ -89,13 +89,10 @@ public class JpaQueryCreator extends
|
||||
* @see
|
||||
* org.springframework.data.repository.query.parser.AbstractQueryCreator
|
||||
* #and(org.springframework.data.repository.query.parser.Part,
|
||||
* java.lang.Object,
|
||||
* org.springframework.data.repository.query.SimpleParameterAccessor
|
||||
* .BindableParameterIterator)
|
||||
* java.lang.Object, java.util.Iterator)
|
||||
*/
|
||||
@Override
|
||||
protected Predicate and(Part part, Predicate base,
|
||||
BindableParameterIterator iterator) {
|
||||
protected Predicate and(Part part, Predicate base, Iterator<Object> iterator) {
|
||||
|
||||
return builder.and(base, toPredicate(part, root, iterator));
|
||||
}
|
||||
@@ -125,7 +122,7 @@ public class JpaQueryCreator extends
|
||||
protected final CriteriaQuery<Object> complete(Predicate predicate,
|
||||
Sort sort) {
|
||||
|
||||
return complete(predicate, sort, query, builder);
|
||||
return complete(predicate, sort, query, builder, root);
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +137,7 @@ public class JpaQueryCreator extends
|
||||
* @return
|
||||
*/
|
||||
protected CriteriaQuery<Object> complete(Predicate predicate, Sort sort,
|
||||
CriteriaQuery<Object> query, CriteriaBuilder builder) {
|
||||
CriteriaQuery<Object> query, CriteriaBuilder builder, Root<?> root) {
|
||||
|
||||
return this.query.select(root).where(predicate)
|
||||
.orderBy(QueryUtils.toOrders(sort, root, builder));
|
||||
@@ -157,7 +154,7 @@ public class JpaQueryCreator extends
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
private Predicate toPredicate(Part part, Root<?> root,
|
||||
BindableParameterIterator iterator) {
|
||||
Iterator<Object> iterator) {
|
||||
|
||||
Expression<Object> path =
|
||||
toExpressionRecursively(root, part.getProperty());
|
||||
@@ -175,9 +172,9 @@ public class JpaQueryCreator extends
|
||||
return builder.lessThan(getComparablePath(root, part),
|
||||
nextAsComparable(iterator));
|
||||
case IS_NULL:
|
||||
return root.isNull();
|
||||
return path.isNull();
|
||||
case IS_NOT_NULL:
|
||||
return root.isNotNull();
|
||||
return path.isNotNull();
|
||||
case LIKE:
|
||||
return builder.like(root.<String> get(part.getProperty()
|
||||
.toDotPath()), iterator.next().toString());
|
||||
@@ -236,15 +233,14 @@ public class JpaQueryCreator extends
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next parameter from the given
|
||||
* {@link BindableParameterIterator} and expects it to be a
|
||||
* {@link Comparable}.
|
||||
* Returns the next parameter from the given {@link Iterator} and expects it
|
||||
* to be a {@link Comparable}.
|
||||
*
|
||||
* @param iterator
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
private Comparable nextAsComparable(BindableParameterIterator iterator) {
|
||||
private Comparable nextAsComparable(Iterator<Object> iterator) {
|
||||
|
||||
Object next = iterator.next();
|
||||
Assert.isInstanceOf(Comparable.class, next,
|
||||
|
||||
@@ -23,9 +23,10 @@ import javax.persistence.Query;
|
||||
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.repository.query.ParameterAccessor;
|
||||
import org.springframework.data.repository.query.Parameters;
|
||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||
import org.springframework.data.repository.query.QueryMethod;
|
||||
import org.springframework.data.repository.query.SimpleParameterAccessor;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
|
||||
@@ -163,8 +164,8 @@ public abstract class JpaQueryExecution {
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Object doExecute(PartTreeJpaQuery query, Object[] parameters) {
|
||||
|
||||
SimpleParameterAccessor accessor =
|
||||
new SimpleParameterAccessor(this.parameters, parameters);
|
||||
ParameterAccessor accessor =
|
||||
new ParametersParameterAccessor(this.parameters, parameters);
|
||||
|
||||
Query countQuery = query.createCountQuery(parameters);
|
||||
Long total = (Long) countQuery.getSingleResult();
|
||||
|
||||
@@ -21,7 +21,8 @@ import javax.persistence.TypedQuery;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.repository.query.SimpleParameterAccessor;
|
||||
import org.springframework.data.repository.query.ParameterAccessor;
|
||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||
import org.springframework.data.repository.query.parser.PartTree;
|
||||
|
||||
|
||||
@@ -61,8 +62,8 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
|
||||
*/
|
||||
public Query createQuery(Object[] parameters) {
|
||||
|
||||
SimpleParameterAccessor accessor =
|
||||
new SimpleParameterAccessor(getParameters(), parameters);
|
||||
ParameterAccessor accessor =
|
||||
new ParametersParameterAccessor(getParameters(), parameters);
|
||||
|
||||
JpaQueryCreator jpaQueryCreator =
|
||||
new JpaQueryCreator(tree, accessor, domainClass,
|
||||
@@ -89,11 +90,11 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
|
||||
*/
|
||||
public Query createCountQuery(Object[] parameters) {
|
||||
|
||||
CriteriaQuery<Object> createQuery =
|
||||
new JpaCountQueryCreator(tree, new SimpleParameterAccessor(
|
||||
CriteriaQuery<Object> query =
|
||||
new JpaCountQueryCreator(tree, new ParametersParameterAccessor(
|
||||
getParameters(), parameters), domainClass,
|
||||
getEntityManager()).createQuery();
|
||||
return getEntityManager().createQuery(createQuery);
|
||||
return getEntityManager().createQuery(query);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -119,7 +119,9 @@ public class UserRepositoryFinderTests {
|
||||
|
||||
Page<User> page =
|
||||
userRepository.findByFirstname(new PageRequest(0, 1), "foobar");
|
||||
assertEquals(1, page.getNumberOfElements());
|
||||
assertThat(page.getNumberOfElements(), is(1));
|
||||
assertThat(page.getTotalElements(), is(2L));
|
||||
assertThat(page.getTotalPages(), is(2));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -759,6 +759,31 @@ public class UserRepositoryTests {
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void executesFindByNotNullLastnameCorrectly() throws Exception {
|
||||
|
||||
flushTestUsers();
|
||||
List<User> result = repository.findByLastnameNotNull();
|
||||
|
||||
assertThat(result.size(), is(3));
|
||||
assertThat(result, hasItems(firstUser, secondUser, thirdUser));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void executesFindByNullLastnameCorrectly() throws Exception {
|
||||
|
||||
flushTestUsers();
|
||||
User forthUser =
|
||||
repository.save(new User("Foo", null, "email@address.com"));
|
||||
|
||||
List<User> result = repository.findByLastnameNull();
|
||||
|
||||
assertThat(result.size(), is(1));
|
||||
assertThat(result, hasItems(forthUser));
|
||||
}
|
||||
|
||||
|
||||
private Page<User> executeSpecWithSort(Sort sort) {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
@@ -190,4 +190,10 @@ public interface UserRepository extends JpaRepository<User, Integer>,
|
||||
|
||||
|
||||
List<User> findByColleaguesLastname(String lastname);
|
||||
|
||||
|
||||
List<User> findByLastnameNotNull();
|
||||
|
||||
|
||||
List<User> findByLastnameNull();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user