From e6e941b40fd849f69b174fdc7452d3e2c1b82fed Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 14 Feb 2011 07:59:54 +0100 Subject: [PATCH 1/6] Use 2.0.0.RELEASE version of AWS build extension to make deployment work again. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e5bebd6b7..13f4d7666 100644 --- a/pom.xml +++ b/pom.xml @@ -392,7 +392,7 @@ org.springframework.build.aws org.springframework.build.aws.maven - 3.1.0.RELEASE + 2.0.0.RELEASE From 23fd1349a331ab44eba7eacf62c144a57a4c4a6d Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 14 Feb 2011 17:54:37 +0100 Subject: [PATCH 2/6] DATAJPA-23 - Fixed query building for IsNull and IsNotNull. Use the actually accessed path instead of the root object. Added test cases to verify behaviour. --- .../jpa/repository/query/JpaQueryCreator.java | 4 +-- .../jpa/repository/UserRepositoryTests.java | 25 +++++++++++++++++++ .../jpa/repository/sample/UserRepository.java | 6 +++++ 3 files changed, 33 insertions(+), 2 deletions(-) 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 22204709d..591c1b7c9 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 @@ -175,9 +175,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. get(part.getProperty() .toDotPath()), iterator.next().toString()); diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index 915d0e28f..3f8aa8612 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -759,6 +759,31 @@ public class UserRepositoryTests { } + @Test + public void executesFindByNotNullLastnameCorrectly() throws Exception { + + flushTestUsers(); + List 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 result = repository.findByLastnameNull(); + + assertThat(result.size(), is(1)); + assertThat(result, hasItems(forthUser)); + } + + private Page executeSpecWithSort(Sort sort) { flushTestUsers(); diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index 9ee513e93..eb1845ce0 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -190,4 +190,10 @@ public interface UserRepository extends JpaRepository, List findByColleaguesLastname(String lastname); + + + List findByLastnameNotNull(); + + + List findByLastnameNull(); } From e5b31d6757ff03bceb91f981d06904201a8e203a Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 14 Feb 2011 18:36:02 +0100 Subject: [PATCH 3/6] DATAJPA-20 - Fixed invalid JPQL example in reference documentation. --- src/docbkx/reference/jpa.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docbkx/reference/jpa.xml b/src/docbkx/reference/jpa.xml index 5d1988cc1..2569e9280 100644 --- a/src/docbkx/reference/jpa.xml +++ b/src/docbkx/reference/jpa.xml @@ -179,7 +179,7 @@ findByAgeOrderByLastnameDesc - … where x.age > ?1 order by x.lastname + … where x.age = ?1 order by x.lastname desc From cd4013fe1d845cab1ddd4859e8413b09ad589700 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 14 Feb 2011 21:44:03 +0100 Subject: [PATCH 4/6] Fixed bug in total page number calculation due to additional root adding. Using the initially created root to create the count projection now. Added more tests to verify correct number of elements and pages. --- .../jpa/repository/query/JpaCountQueryCreator.java | 14 ++++++-------- .../data/jpa/repository/query/JpaQueryCreator.java | 4 ++-- .../jpa/repository/query/PartTreeJpaQuery.java | 4 ++-- .../jpa/repository/UserRepositoryFinderTests.java | 4 +++- 4 files changed, 13 insertions(+), 13 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 eae9b6415..7728e84e6 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 @@ -19,6 +19,7 @@ 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; @@ -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}. * @@ -48,7 +46,6 @@ public class JpaCountQueryCreator extends JpaQueryCreator { EntityManager em) { super(tree, parameters, domainClass, em); - this.domainClass = domainClass; } @@ -56,16 +53,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 complete(Predicate predicate, Sort sort, - CriteriaQuery query, CriteriaBuilder builder) { + CriteriaQuery query, CriteriaBuilder builder, Root root) { - return query.select(builder.count(query.from(domainClass))); + return query.select(builder.count(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 591c1b7c9..75fefff2b 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 @@ -125,7 +125,7 @@ public class JpaQueryCreator extends protected final CriteriaQuery complete(Predicate predicate, Sort sort) { - return complete(predicate, sort, query, builder); + return complete(predicate, sort, query, builder, root); } @@ -140,7 +140,7 @@ public class JpaQueryCreator extends * @return */ protected CriteriaQuery complete(Predicate predicate, Sort sort, - CriteriaQuery query, CriteriaBuilder builder) { + CriteriaQuery query, CriteriaBuilder builder, Root root) { return this.query.select(root).where(predicate) .orderBy(QueryUtils.toOrders(sort, root, builder)); diff --git a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java index 99947a945..ee0a61c85 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java @@ -89,11 +89,11 @@ public class PartTreeJpaQuery extends AbstractJpaQuery { */ public Query createCountQuery(Object[] parameters) { - CriteriaQuery createQuery = + CriteriaQuery query = new JpaCountQueryCreator(tree, new SimpleParameterAccessor( getParameters(), parameters), domainClass, getEntityManager()).createQuery(); - return getEntityManager().createQuery(createQuery); + return getEntityManager().createQuery(query); } diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java index 57d3749cd..93d3bdcce 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java @@ -119,7 +119,9 @@ public class UserRepositoryFinderTests { Page 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)); } From e22bee3e3f9942e3ccb0f654976bf8c645abe2a0 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 16 Feb 2011 20:30:33 +0100 Subject: [PATCH 5/6] DATADOC-24 - Adapted changes from Spring Data Commons. --- .../data/jpa/repository/query/JpaCountQueryCreator.java | 7 +++---- .../data/jpa/repository/query/JpaQueryExecution.java | 7 ++++--- .../data/jpa/repository/query/PartTreeJpaQuery.java | 9 +++++---- 3 files changed, 12 insertions(+), 11 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 7728e84e6..9ab545177 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 @@ -22,7 +22,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.ParameterAccessor; import org.springframework.data.repository.query.parser.PartTree; @@ -41,9 +41,8 @@ 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); } diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java index 40b4e95c1..154186ac4 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java @@ -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(); diff --git a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java index ee0a61c85..a55edc949 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java @@ -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, @@ -90,7 +91,7 @@ public class PartTreeJpaQuery extends AbstractJpaQuery { public Query createCountQuery(Object[] parameters) { CriteriaQuery query = - new JpaCountQueryCreator(tree, new SimpleParameterAccessor( + new JpaCountQueryCreator(tree, new ParametersParameterAccessor( getParameters(), parameters), domainClass, getEntityManager()).createQuery(); return getEntityManager().createQuery(query); From c31432e2186a3a1745adf3cb8b55767f80061494 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 16 Feb 2011 21:20:15 +0100 Subject: [PATCH 6/6] Fixed missing changes to adapt changes in Spring Data Commons for DATADOC-24. --- .../jpa/repository/query/JpaQueryCreator.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) 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 75fefff2b..8cad04872 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 @@ -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 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 iterator) { return builder.and(base, toPredicate(part, root, iterator)); } @@ -157,7 +154,7 @@ public class JpaQueryCreator extends */ @SuppressWarnings({ "unchecked", "rawtypes" }) private Predicate toPredicate(Part part, Root root, - BindableParameterIterator iterator) { + Iterator iterator) { Expression path = toExpressionRecursively(root, part.getProperty()); @@ -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 iterator) { Object next = iterator.next(); Assert.isInstanceOf(Comparable.class, next,