diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java index 81a86da68..1446b570c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java @@ -202,7 +202,7 @@ class StringQuery { return Type.STARTING_WITH; } - throw new IllegalArgumentException(String.format("Illegal like pattern %s!", expression)); + return Type.LIKE; } /** @@ -214,7 +214,7 @@ class StringQuery { static class LikeBinding { private static final List SUPPORTED_TYPES = Arrays.asList(Type.CONTAINING, Type.STARTING_WITH, - Type.ENDING_WITH); + Type.ENDING_WITH, Type.LIKE); private final String name; private final Integer position; @@ -303,6 +303,7 @@ class StringQuery { return String.format("%%%s", value.toString()); case CONTAINING: return String.format("%%%s%%", value.toString()); + case LIKE: default: return value; } diff --git a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java index 408a304d3..fc31b0055 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java @@ -25,18 +25,39 @@ import org.springframework.data.jpa.repository.query.StringQuery.LikeBinding; import org.springframework.data.repository.query.parser.Part.Type; /** + * Unit tests for {@link StringQuery}. + * * @author Oliver Gierke */ public class StringQueryUnitTests { + /** + * @see DATAJPA-341 + */ + @Test + public void doesNotConsiderPlainLikeABinding() { + + String source = "select from User u where u.firstname like :firstname"; + StringQuery query = new StringQuery(source); + + assertThat(query.hasLikeBindings(), is(true)); + assertThat(query.getQuery(), is(source)); + + List bindings = query.getLikeBindings(); + assertThat(bindings, hasSize(1)); + + LikeBinding binding = bindings.get(0); + assertThat(binding.getType(), is(Type.LIKE)); + assertThat(binding.hasName("firstname"), is(true)); + } + @Test public void detectsPositionalLikeBindings() { StringQuery query = new StringQuery("select u from User u where u.firstname like %?1% or u.lastname like %?2"); assertThat(query.hasLikeBindings(), is(true)); - assertThat(query.getQuery(), - is("select u from User u where u.firstname like ?1 or u.lastname like ?2")); + assertThat(query.getQuery(), is("select u from User u where u.firstname like ?1 or u.lastname like ?2")); List bindings = query.getLikeBindings(); assertThat(bindings, hasSize(2));