Created
October 20, 2014 18:30
-
-
Save thomasdarimont/9303fcdabaa84f5e7b3c to your computer and use it in GitHub Desktop.
Prototypic support for NotContaining part expression for Spring Data JPA.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[34mMon Oct 20 20:28:24 2014 +0200[m [33m5a416d0[32m (HEAD, feature/support-not-contains)[m [34mDATAJPA-XXX - Add support for notContains in derived queries. [35m [Thomas Darimont][m | |
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