From a04d9b868b3cdfdb20cf4509e59020e8b5d836d0 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 13 Mar 2017 15:58:54 +0100 Subject: [PATCH] DATAJPA-1074 - Polishing. Slightly changed the implementation to reject IsEmpty for non-collection properties. Minor formatting in unit tests. Original pull request: #190. --- .../jpa/repository/query/JpaQueryCreator.java | 11 +++++++---- .../query/PartTreeJpaQueryIntegrationTests.java | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 6 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 89c152607..137cc4961 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 @@ -310,11 +310,14 @@ public class JpaQueryCreator extends AbstractQueryCreator> emptyExpression = traversePath(root, property); - return type.equals(IS_NOT_EMPTY) ? builder.isNotEmpty(emptyExpression) - : builder.isEmpty(emptyExpression); + + if (!property.getLeafProperty().isCollection()) { + throw new IllegalArgumentException("IsEmpty / IsNotEmpty can only be used on collection properties!"); } + + Expression> collectionPath = traversePath(root, property); + return type.equals(IS_NOT_EMPTY) ? builder.isNotEmpty(collectionPath) : builder.isEmpty(collectionPath); + default: throw new IllegalArgumentException("Unsupported keyword " + type); } diff --git a/src/test/java/org/springframework/data/jpa/repository/query/PartTreeJpaQueryIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/query/PartTreeJpaQueryIntegrationTests.java index 2af8c95ec..4215f105a 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/PartTreeJpaQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/PartTreeJpaQueryIntegrationTests.java @@ -121,7 +121,7 @@ public class PartTreeJpaQueryIntegrationTests { JpaQueryMethod queryMethod = getQueryMethod("existsByFirstname", String.class); PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider); - Query query = jpaQuery.createQuery(new Object[]{"Matthews"}); + Query query = jpaQuery.createQuery(new Object[] { "Matthews" }); assertThat(query.getMaxResults(), is(1)); } @@ -132,7 +132,7 @@ public class PartTreeJpaQueryIntegrationTests { JpaQueryMethod queryMethod = getQueryMethod("existsByFirstname", String.class); PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider); - Query query = jpaQuery.createQuery(new Object[]{"Matthews"}); + Query query = jpaQuery.createQuery(new Object[] { "Matthews" }); assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), containsString(".id from User as")); } @@ -159,6 +159,15 @@ public class PartTreeJpaQueryIntegrationTests { assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), endsWith("roles is not empty")); } + @Test(expected = IllegalArgumentException.class) // DATAJPA-1074 + public void rejectsIsEmptyOnNonCollectionProperty() throws Exception { + + JpaQueryMethod method = getQueryMethod("findByFirstnameIsEmpty"); + AbstractJpaQuery jpaQuery = new PartTreeJpaQuery(method, entityManager, provider); + + jpaQuery.createQuery(new Object[] { "Oliver" }); + } + private void testIgnoreCase(String methodName, Object... values) throws Exception { Class[] parameterTypes = new Class[values.length]; @@ -219,5 +228,7 @@ public class PartTreeJpaQueryIntegrationTests { List findByRolesIsEmpty(); List findByRolesIsNotEmpty(); + + List findByFirstnameIsEmpty(); } }