Skip to content

Commit a026df0

Browse files
committed
Only add quotes around String query parameters
1 parent 3b59581 commit a026df0

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/main/java/org/springframework/data/elasticsearch/repository/support/StringQueryUtil.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,13 @@ private static String convert(Object parameter) {
6767
if (Collection.class.isAssignableFrom(parameter.getClass())) {
6868
Collection<?> collectionParam = (Collection<?>) parameter;
6969
StringBuilder sb = new StringBuilder("[");
70-
sb.append(collectionParam.stream().map(o -> "\"" + convert(o) + "\"").collect(Collectors.joining(",")));
70+
sb.append(collectionParam.stream().map(o -> {
71+
if (o instanceof String) {
72+
return "\"" + convert(o) + "\"";
73+
} else {
74+
return convert(o);
75+
}
76+
}).collect(Collectors.joining(",")));
7177
sb.append("]");
7278
return sb.toString();
7379
} else {

src/test/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQueryUnitTests.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,28 @@ void shouldEscapeStringsInQueryParameters() throws Exception {
9797
.isEqualTo("{\"bool\":{\"must\": [{\"match\": {\"prefix\": {\"name\" : \"hello \\\"Stranger\\\"\"}}]}}");
9898
}
9999

100+
@Test // #1858
101+
@DisplayName("should only quote String query parameters")
102+
void shouldOnlyEscapeStringQueryParameters() throws Exception {
103+
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByAge", Integer.valueOf(30));
104+
105+
assertThat(query).isInstanceOf(StringQuery.class);
106+
assertThat(((StringQuery) query).getSource()).isEqualTo("{ 'bool' : { 'must' : { 'term' : { 'age' : 30 } } } }");
107+
108+
}
109+
110+
@Test // #1858
111+
@DisplayName("should only quote String collection query parameters")
112+
void shouldOnlyEscapeStringCollectionQueryParameters() throws Exception {
113+
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByAgeIn",
114+
new ArrayList<>(Arrays.asList(30, 35, 40)));
115+
116+
assertThat(query).isInstanceOf(StringQuery.class);
117+
assertThat(((StringQuery) query).getSource())
118+
.isEqualTo("{ 'bool' : { 'must' : { 'term' : { 'age' : [30,35,40] } } } }");
119+
120+
}
121+
100122
@Test // #1858
101123
@DisplayName("should escape Strings in collection query parameters")
102124
void shouldEscapeStringsInCollectionsQueryParameters() throws Exception {
@@ -132,6 +154,12 @@ private ElasticsearchQueryMethod getQueryMethod(String name, Class<?>... paramet
132154

133155
private interface SampleRepository extends Repository<Person, String> {
134156

157+
@Query("{ 'bool' : { 'must' : { 'term' : { 'age' : ?0 } } } }")
158+
List<Person> findByAge(Integer age);
159+
160+
@Query("{ 'bool' : { 'must' : { 'term' : { 'age' : ?0 } } } }")
161+
List<Person> findByAgeIn(ArrayList<Integer> age);
162+
135163
@Query("{ 'bool' : { 'must' : { 'term' : { 'name' : '?0' } } } }")
136164
Person findByName(String name);
137165

@@ -150,16 +178,27 @@ Person findWithRepeatedPlaceholder(String arg0, String arg1, String arg2, String
150178
* @author Rizwan Idrees
151179
* @author Mohsin Husen
152180
* @author Artur Konczak
181+
* @author Niklas Herder
153182
*/
154183

155184
@Document(indexName = "test-index-person-query-unittest")
156185
static class Person {
157186

187+
@Nullable public int age;
158188
@Nullable @Id private String id;
159189
@Nullable private String name;
160190
@Nullable @Field(type = FieldType.Nested) private List<Car> car;
161191
@Nullable @Field(type = FieldType.Nested, includeInParent = true) private List<Book> books;
162192

193+
@Nullable
194+
public int getAge() {
195+
return age;
196+
}
197+
198+
public void setAge(int age) {
199+
this.age = age;
200+
}
201+
163202
@Nullable
164203
public String getId() {
165204
return id;

0 commit comments

Comments
 (0)