Skip to content

Commit c223481

Browse files
mp911degregturn
authored andcommitted
Revise String Query ParameterBinding.
We now distinguish between the binding parameter target and its origin. The parameter target represents how the binding is bound to the query, the origin points to where the binding parameter comes from (method invocation argument or an expression). The revised design removes the assumption that binding parameters must match their indices/names of the method call to introduce synthetic parameters for different binding variants while using the same underlying invocation parameters. See #3041
1 parent a1e6bbc commit c223481

File tree

10 files changed

+695
-612
lines changed

10 files changed

+695
-612
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/DeclaredQuery.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ static DeclaredQuery of(@Nullable String query, boolean nativeQuery) {
7171
boolean isDefaultProjection();
7272

7373
/**
74-
* Returns the {@link StringQuery.ParameterBinding}s registered.
74+
* Returns the {@link ParameterBinding}s registered.
7575
*/
76-
List<StringQuery.ParameterBinding> getParameterBindings();
76+
List<ParameterBinding> getParameterBindings();
7777

7878
/**
7979
* Creates a new {@literal DeclaredQuery} representing a count query, i.e. a query returning the number of rows to be

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EmptyDeclaredQuery.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public boolean isDefaultProjection() {
6060
}
6161

6262
@Override
63-
public List<StringQuery.ParameterBinding> getParameterBindings() {
63+
public List<ParameterBinding> getParameterBindings() {
6464
return Collections.emptyList();
6565
}
6666

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterBinderFactory.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
import java.util.List;
2020

2121
import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter;
22+
import org.springframework.data.jpa.repository.query.ParameterBinding.BindingIdentifier;
23+
import org.springframework.data.jpa.repository.query.ParameterBinding.ParameterOrigin;
2224
import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.ParameterMetadata;
23-
import org.springframework.data.jpa.repository.query.StringQuery.ParameterBinding;
2425
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
2526
import org.springframework.expression.spel.standard.SpelExpressionParser;
2627
import org.springframework.util.Assert;
@@ -46,11 +47,10 @@ static ParameterBinder createBinder(JpaParameters parameters) {
4647

4748
Assert.notNull(parameters, "JpaParameters must not be null");
4849

49-
QueryParameterSetterFactory likeFactory = QueryParameterSetterFactory.forLikeRewrite(parameters);
5050
QueryParameterSetterFactory setterFactory = QueryParameterSetterFactory.basic(parameters);
5151
List<ParameterBinding> bindings = getBindings(parameters);
5252

53-
return new ParameterBinder(parameters, createSetters(bindings, likeFactory, setterFactory));
53+
return new ParameterBinder(parameters, createSetters(bindings, setterFactory));
5454
}
5555

5656
/**
@@ -97,11 +97,9 @@ static ParameterBinder createQueryAwareBinder(JpaParameters parameters, Declared
9797
QueryParameterSetterFactory expressionSetterFactory = QueryParameterSetterFactory.parsing(parser,
9898
evaluationContextProvider, parameters);
9999

100-
QueryParameterSetterFactory like = QueryParameterSetterFactory.forLikeRewrite(parameters);
101100
QueryParameterSetterFactory basicSetterFactory = QueryParameterSetterFactory.basic(parameters);
102101

103-
return new ParameterBinder(parameters,
104-
createSetters(bindings, query, expressionSetterFactory, like, basicSetterFactory),
102+
return new ParameterBinder(parameters, createSetters(bindings, query, expressionSetterFactory, basicSetterFactory),
105103
!query.usesPaging());
106104
}
107105

@@ -113,7 +111,11 @@ private static List<ParameterBinding> getBindings(JpaParameters parameters) {
113111
for (JpaParameter parameter : parameters) {
114112

115113
if (parameter.isBindable()) {
116-
result.add(new ParameterBinding(++bindableParameterIndex));
114+
int index = ++bindableParameterIndex;
115+
BindingIdentifier bindingIdentifier = parameter.getName().map(it -> BindingIdentifier.of(it, index))
116+
.orElseGet(() -> BindingIdentifier.of(index));
117+
118+
result.add(new ParameterBinding(bindingIdentifier, ParameterOrigin.ofParameter(bindingIdentifier)));
117119
}
118120
}
119121

0 commit comments

Comments
 (0)