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 f239459f9..b51128e49 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 @@ -16,6 +16,7 @@ package org.springframework.data.jpa.repository.query; import static org.springframework.data.jpa.repository.query.QueryUtils.*; +import static org.springframework.data.repository.query.parser.Part.Type.*; import java.util.Collection; import java.util.Iterator; @@ -197,8 +198,9 @@ public class JpaQueryCreator extends AbstractQueryCreator, PropertyPath property = part.getProperty(); Expression path = toExpressionRecursively(root, property); + Type type = part.getType(); - switch (part.getType()) { + switch (type) { case BETWEEN: ParameterMetadata first = provider.next(part); ParameterMetadata second = provider.next(part); @@ -229,11 +231,12 @@ public class JpaQueryCreator extends AbstractQueryCreator, case CONTAINING: case LIKE: case NOT_LIKE: + case NOT_CONTAINING: Expression stringPath = getTypedPath(root, part); Expression propertyExpression = upperIfIgnoreCase(stringPath); Expression parameterExpression = upperIfIgnoreCase(provider.next(part, String.class).getExpression()); Predicate like = builder.like(propertyExpression, parameterExpression); - return part.getType() == Type.NOT_LIKE ? like.not() : like; + return type.equals(NOT_LIKE) || type.equals(NOT_CONTAINING) ? like.not() : like; case TRUE: Expression truePath = getTypedPath(root, part); return builder.isTrue(truePath); @@ -247,7 +250,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, case NEGATING_SIMPLE_PROPERTY: return builder.notEqual(upperIfIgnoreCase(path), upperIfIgnoreCase(provider.next(part).getExpression())); default: - throw new IllegalArgumentException("Unsupported keyword " + part.getType()); + throw new IllegalArgumentException("Unsupported keyword " + type); } } diff --git a/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java b/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java index b53cfb5ce..1647bb749 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java @@ -234,6 +234,7 @@ class ParameterMetadataProvider { case ENDING_WITH: return String.format("%%%s", value.toString()); case CONTAINING: + case NOT_CONTAINING: return String.format("%%%s%%", value.toString()); default: return value; diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java index e5f73e188..0062cf902 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package org.springframework.data.jpa.repository; -import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.springframework.data.domain.Sort.Direction.*; @@ -194,4 +194,12 @@ public class UserRepositoryFinderTests { assertThat(slice.getContent(), hasItem(dave)); assertThat(slice.hasNext(), is(true)); } + + /** + * @see DATAJPA-830 + */ + @Test + public void executesMethodWithNotContainingOnStringCorrectly() { + assertThat(userRepository.findByLastnameNotContaining("u"), containsInAnyOrder(dave, oliver)); + } } 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 3d968a27b..e800cdcf8 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 @@ -575,4 +575,9 @@ public interface UserRepository */ @Query("select u from User u") Stream streamAllPaged(Pageable pageable); + + /** + * @see DATAJPA-830 + */ + List findByLastnameNotContaining(String part); }