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(); } }