Skip to content

Instantly share code, notes, and snippets.

@thomasdarimont
Created October 20, 2014 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thomasdarimont/9303fcdabaa84f5e7b3c to your computer and use it in GitHub Desktop.
Save thomasdarimont/9303fcdabaa84f5e7b3c to your computer and use it in GitHub Desktop.
Prototypic support for NotContaining part expression for Spring Data JPA.
Mon Oct 20 20:28:24 2014 +0200 5a416d0 (HEAD, feature/support-not-contains) DATAJPA-XXX - Add support for notContains in derived queries.  [Thomas Darimont]
diff --git a/pom.xml b/pom.xml
index bbe0973..c49b1cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
<hsqldb1>1.8.0.10</hsqldb1>
<jpa>2.0.0</jpa>
<openjpa>2.3.0</openjpa>
- <springdata.commons>1.10.0.BUILD-SNAPSHOT</springdata.commons>
+ <springdata.commons>1.10.0.DATACMNS-581-SNAPSHOT</springdata.commons>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
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 c6f21d2..a818b54 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
@@ -32,7 +32,6 @@ import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.P
import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
import org.springframework.data.repository.query.parser.Part;
-import org.springframework.data.repository.query.parser.Part.Type;
import org.springframework.data.repository.query.parser.PartTree;
import org.springframework.util.Assert;
@@ -226,6 +225,7 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<Object>,
return path.in(provider.next(part, Collection.class).getExpression());
case STARTING_WITH:
case ENDING_WITH:
+ case NOT_CONTAINING:
case CONTAINING:
case LIKE:
case NOT_LIKE:
@@ -233,7 +233,13 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<Object>,
Expression<String> propertyExpression = upperIfIgnoreCase(stringPath);
Expression<String> parameterExpression = upperIfIgnoreCase(provider.next(part, String.class).getExpression());
Predicate like = builder.like(propertyExpression, parameterExpression);
- return part.getType() == Type.NOT_LIKE ? like.not() : like;
+ switch(part.getType()) {
+ case NOT_LIKE:
+ case NOT_CONTAINING:
+ return like.not();
+ default:
+ return like;
+ }
case TRUE:
Expression<Boolean> truePath = getTypedPath(root, part);
return builder.isTrue(truePath);
@@ -269,6 +275,9 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<Object>,
if (canUpperCase(expression)) {
return (Expression<T>) builder.upper((Expression<String>) expression);
}
+ case NEVER:
+ default:
+ //fall through
}
return (Expression<T>) expression;
}
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 7f1517a..570720e 100644
--- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java
+++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java
@@ -1752,6 +1752,16 @@ public class UserRepositoryTests {
assertThat(users.getContent().get(0), is(thirdUser));
assertThat(users.getContent().get(1), is(fourthUser));
}
+
+ @Test
+ public void foo() throws Exception {
+
+ flushTestUsers();
+
+ List<User> users = repository.findAllByFirstnameNotContaining("%li%");
+
+ assertThat(users, hasSize(3));
+ }
private Page<User> executeSpecWithSort(Sort sort) {
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 3f7327e..9fd1186 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
@@ -527,4 +527,6 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
value = "select * from (select rownum() as RN, u.* from User u) where RN between ?#{ #pageable.offset -1} and ?#{#pageable.offset + #pageable.pageSize}",
countQuery = "select count(u.id) from User u", nativeQuery = true)
Page<User> findUsersInNativeQueryWithPagination(Pageable pageable);
+
+ List<User> findAllByFirstnameNotContaining(String firstname);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment