diff --git a/src/main/java/org/springframework/data/repository/query/SpelEvaluator.java b/src/main/java/org/springframework/data/repository/query/SpelEvaluator.java index 1f908fc66..132e25f77 100644 --- a/src/main/java/org/springframework/data/repository/query/SpelEvaluator.java +++ b/src/main/java/org/springframework/data/repository/query/SpelEvaluator.java @@ -15,9 +15,8 @@ */ package org.springframework.data.repository.query; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; import org.springframework.data.repository.query.SpelQueryContext.SpelExtractor; import org.springframework.data.spel.ExpressionDependencies; @@ -62,11 +61,12 @@ public class SpelEvaluator { Assert.notNull(values, "Values must not be null."); + Map parameterMap = extractor.getParameterMap(); + Map results = new LinkedHashMap<>(parameterMap.size()); - return extractor.getParameters().collect(Collectors.toMap(// - Entry::getKey, // - it -> getSpElValue(it.getValue(), values) // - )); + parameterMap.forEach((parameter, expression) -> results.put(parameter, getSpElValue(expression, values))); + + return results; } /** diff --git a/src/main/java/org/springframework/data/repository/query/SpelQueryContext.java b/src/main/java/org/springframework/data/repository/query/SpelQueryContext.java index 0b9ca085c..e53ef62fa 100644 --- a/src/main/java/org/springframework/data/repository/query/SpelQueryContext.java +++ b/src/main/java/org/springframework/data/repository/query/SpelQueryContext.java @@ -22,11 +22,9 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Stream; import org.springframework.data.domain.Range; import org.springframework.data.domain.Range.Bound; @@ -288,9 +286,6 @@ public class SpelQueryContext { return expressions; } - Stream> getParameters() { - return expressions.entrySet().stream(); - } } /** diff --git a/src/test/java/org/springframework/data/repository/query/SpelEvaluatorUnitTests.java b/src/test/java/org/springframework/data/repository/query/SpelEvaluatorUnitTests.java new file mode 100644 index 000000000..ac758c004 --- /dev/null +++ b/src/test/java/org/springframework/data/repository/query/SpelEvaluatorUnitTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.repository.query; + +import static org.assertj.core.api.Assertions.*; + +import java.lang.reflect.Method; + +import org.junit.jupiter.api.Test; +import org.springframework.data.repository.query.SpelQueryContext.SpelExtractor; + +/** + * Unit tests for {@link SpelEvaluator}. + * + * @author Mark Paluch + */ +class SpelEvaluatorUnitTests { + + final SpelQueryContext context = SpelQueryContext.of((counter, s) -> String.format("__$synthetic$__%d", counter + 1), + String::concat); + + @Test // GH-2904 + void shouldEvaluateExpression() throws Exception { + + SpelExtractor extractor = context.parse("SELECT :#{#value}"); + Method method = MyRepository.class.getDeclaredMethod("simpleExpression", String.class); + SpelEvaluator evaluator = new SpelEvaluator(QueryMethodEvaluationContextProvider.DEFAULT, + new DefaultParameters(method), extractor); + + assertThat(evaluator.getQueryString()).isEqualTo("SELECT :__$synthetic$__1"); + assertThat(evaluator.evaluate(new Object[] { "hello" })).containsEntry("__$synthetic$__1", "hello"); + } + + @Test // GH-2904 + void shouldAllowNullValues() throws Exception { + + SpelExtractor extractor = context.parse("SELECT :#{#value}"); + Method method = MyRepository.class.getDeclaredMethod("simpleExpression", String.class); + SpelEvaluator evaluator = new SpelEvaluator(QueryMethodEvaluationContextProvider.DEFAULT, + new DefaultParameters(method), extractor); + + assertThat(evaluator.getQueryString()).isEqualTo("SELECT :__$synthetic$__1"); + assertThat(evaluator.evaluate(new Object[] { null })).containsEntry("__$synthetic$__1", null); + } + + interface MyRepository { + + void simpleExpression(String value); + + } +}