From 90c8361679cf5fbb326388686fba8635f9bba1f7 Mon Sep 17 00:00:00 2001 From: Michael Cramer Date: Fri, 10 Mar 2017 19:20:24 +0100 Subject: [PATCH] DATAJPA-1074 - Added support for IsEmpty/IsNotEmpty keywords in query derivation. We now translate the newly introduced IsEmpty / IsNotEmpty keywords into the corresponding Criteria API artifacts. Original pull request: #190. --- .../jpa/repository/query/JpaQueryCreator.java | 8 ++++++ .../PartTreeJpaQueryIntegrationTests.java | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+) 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 c2d055257..89c152607 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 @@ -49,6 +49,7 @@ import org.springframework.util.Assert; * * @author Oliver Gierke * @author Mark Paluch + * @author Michael Cramer */ public class JpaQueryCreator extends AbstractQueryCreator, Predicate> { @@ -307,6 +308,13 @@ public class JpaQueryCreator extends AbstractQueryCreator> emptyExpression = traversePath(root, property); + return type.equals(IS_NOT_EMPTY) ? builder.isNotEmpty(emptyExpression) + : builder.isEmpty(emptyExpression); + } 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 669083ee7..2af8c95ec 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 @@ -57,6 +57,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * * @author Oliver Gierke * @author Mark Paluch + * @author Michael Cramer */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:infrastructure.xml") @@ -136,6 +137,28 @@ public class PartTreeJpaQueryIntegrationTests { assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), containsString(".id from User as")); } + @Test // DATAJPA-1074 + public void isEmptyCollection() throws Exception { + + JpaQueryMethod queryMethod = getQueryMethod("findByRolesIsEmpty"); + PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider); + + Query query = jpaQuery.createQuery(new Object[] {}); + + assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), endsWith("roles is empty")); + } + + @Test // DATAJPA-1074 + public void isNotEmptyCollection() throws Exception { + + JpaQueryMethod queryMethod = getQueryMethod("findByRolesIsNotEmpty"); + PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider); + + Query query = jpaQuery.createQuery(new Object[] {}); + + assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), endsWith("roles is not empty")); + } + private void testIgnoreCase(String methodName, Object... values) throws Exception { Class[] parameterTypes = new Class[values.length]; @@ -192,5 +215,9 @@ public class PartTreeJpaQueryIntegrationTests { boolean existsByFirstname(String firstname); List findByCreatedAtAfter(@Temporal(TemporalType.TIMESTAMP) @Param("refDate") Date refDate); + + List findByRolesIsEmpty(); + + List findByRolesIsNotEmpty(); } }