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 58a952925..b55e95e39 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 @@ -15,7 +15,12 @@ */ package org.springframework.data.jpa.repository.query; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -192,6 +197,7 @@ class ParameterMetadataProvider { private final ParameterExpression expression; private final EscapeCharacter escape; private final boolean ignoreCase; + private final boolean noWildcards; /** * Creates a new {@link ParameterMetadata}. @@ -202,6 +208,7 @@ class ParameterMetadataProvider { this.expression = expression; this.type = value == null && Type.SIMPLE_PROPERTY.equals(part.getType()) ? Type.IS_NULL : part.getType(); this.ignoreCase = IgnoreCaseType.ALWAYS.equals(part.shouldIgnoreCase()); + this.noWildcards = part.getProperty().getLeafProperty().isCollection(); this.escape = escape; } @@ -237,7 +244,7 @@ class ParameterMetadataProvider { return condensedValue; } - if (String.class.equals(expression.getJavaType())) { + if (String.class.equals(expression.getJavaType()) && !noWildcards) { switch (type) { case STARTING_WITH: 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 e002a1dda..c0f6204b8 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -2829,6 +2829,24 @@ public class UserRepositoryTests { .map(User::getAge).contains(30); } + @Test // GH-2607 + void containsWithCollection() { + + firstUser.getAttributes().add("cool"); + firstUser.getAttributes().add("hip"); + + secondUser.getAttributes().add("hip"); + + thirdUser.getAttributes().add("rockstar"); + thirdUser.getAttributes().add("%hip%"); + + flushTestUsers(); + + List result = repository.findByAttributesContains("hip"); + + assertThat(result).containsOnly(firstUser, secondUser); + } + private Page executeSpecWithSort(Sort sort) { flushTestUsers();