Skip to content

Commit 3412bcc

Browse files
BigMichi1odrotbohm
authored andcommitted
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.
1 parent ffaedb9 commit 3412bcc

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java

+8
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
*
4949
* @author Oliver Gierke
5050
* @author Mark Paluch
51+
* @author Michael Cramer
5152
*/
5253
public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<? extends Object>, Predicate> {
5354

@@ -306,6 +307,13 @@ public Predicate build() {
306307
case NEGATING_SIMPLE_PROPERTY:
307308
return builder.notEqual(upperIfIgnoreCase(getTypedPath(root, part)),
308309
upperIfIgnoreCase(provider.next(part).getExpression()));
310+
case IS_EMPTY:
311+
case IS_NOT_EMPTY:
312+
if (property.getLeafProperty().isCollection()) {
313+
Expression<Collection<Object>> emptyExpression = traversePath(root, property);
314+
return type.equals(IS_NOT_EMPTY) ? builder.isNotEmpty(emptyExpression)
315+
: builder.isEmpty(emptyExpression);
316+
}
309317
default:
310318
throw new IllegalArgumentException("Unsupported keyword " + type);
311319
}

src/test/java/org/springframework/data/jpa/repository/query/PartTreeJpaQueryIntegrationTests.java

+27
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
*
5858
* @author Oliver Gierke
5959
* @author Mark Paluch
60+
* @author Michael Cramer
6061
*/
6162
@RunWith(SpringJUnit4ClassRunner.class)
6263
@ContextConfiguration("classpath:infrastructure.xml")
@@ -136,6 +137,28 @@ public void shouldSelectAliasedIdForExistsProjectionQueries() throws Exception {
136137
assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), containsString(".id from User as"));
137138
}
138139

140+
@Test // DATAJPA-1074
141+
public void isEmptyCollection() throws Exception {
142+
143+
JpaQueryMethod queryMethod = getQueryMethod("findByRolesIsEmpty");
144+
PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider);
145+
146+
Query query = jpaQuery.createQuery(new Object[] {});
147+
148+
assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), endsWith("roles is empty"));
149+
}
150+
151+
@Test // DATAJPA-1074
152+
public void isNotEmptyCollection() throws Exception {
153+
154+
JpaQueryMethod queryMethod = getQueryMethod("findByRolesIsNotEmpty");
155+
PartTreeJpaQuery jpaQuery = new PartTreeJpaQuery(queryMethod, entityManager, provider);
156+
157+
Query query = jpaQuery.createQuery(new Object[] {});
158+
159+
assertThat(HibernateUtils.getHibernateQuery(getValue(query, PROPERTY)), endsWith("roles is not empty"));
160+
}
161+
139162
private void testIgnoreCase(String methodName, Object... values) throws Exception {
140163

141164
Class<?>[] parameterTypes = new Class[values.length];
@@ -192,5 +215,9 @@ interface UserRepository extends Repository<User, Long> {
192215
boolean existsByFirstname(String firstname);
193216

194217
List<User> findByCreatedAtAfter(@Temporal(TemporalType.TIMESTAMP) @Param("refDate") Date refDate);
218+
219+
List<User> findByRolesIsEmpty();
220+
221+
List<User> findByRolesIsNotEmpty();
195222
}
196223
}

0 commit comments

Comments
 (0)