diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameter.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameter.java index 79d648915..72393f1c6 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameter.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameter.java @@ -78,19 +78,6 @@ public final class Parameter { } - /** - * Copy constructor to put a {@link Parameter} into another context. - * - * @param parameter - * @param parameters - * @param index - */ - Parameter(Parameter parameter, Parameters parameters, int index) { - - this(parameter.type, parameters, index, parameter.name); - } - - /** * Returns whether the {@link Parameter} is the first one. * @@ -162,7 +149,7 @@ public final class Parameter { if (isNamedParameter()) { return format(NAMED_PARAMETER_TEMPLATE, getName()); } else { - return format(POSITION_PARAMETER_TEMPLATE, getParameterIndex()); + return format(POSITION_PARAMETER_TEMPLATE, getIndex()); } } @@ -173,9 +160,9 @@ public final class Parameter { * * @return */ - public int getParameterIndex() { + public int getIndex() { - return parameters.getPlaceholderPosition(this); + return index; } diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameters.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameters.java index 6ca13d1bc..0059a1437 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameters.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/Parameters.java @@ -124,8 +124,7 @@ public final class Parameters implements Iterable { for (int i = 0; i < originals.size(); i++) { Parameter original = originals.get(i); - - this.parameters.add(new Parameter(original, this, i)); + this.parameters.add(original); pageableIndexTemp = original.isPageable() ? i : -1; sortIndexTemp = original.isSort() ? i : -1; @@ -265,29 +264,17 @@ public final class Parameters implements Iterable { /** - * Returns the index of the placeholder inside a query for the parameter - * with the given index. They might differ from the parameter index as the - * method signature can contain special parameters (e.g. {@link Sort}, - * {@link Pageable}) that are not bound as plain query parameters but rather - * handled differently. + * Returns a bindable parameter with the given index. So for a method with a + * signature of {@code (Pageable pageable, String name)} a call to + * {@code #getBindableParameter(0)} will return the {@link String} + * parameter. * - * @param index - * @return the placeholder postion for the parameter with the given index. - * Will return -1 for special parameters. + * @param bindableIndex + * @return */ - int getPlaceholderPosition(Parameter parameter) { + public Parameter getBindableParameter(int bindableIndex) { - return parameter.isSpecialParameter() ? -1 - : getPlaceholderPositionRecursively(parameter); - } - - - private int getPlaceholderPositionRecursively(Parameter parameter) { - - int result = parameter.isSpecialParameter() ? 0 : 1; - - return parameter.isFirst() ? result - 1 : result - + getPlaceholderPositionRecursively(parameter.getPrevious()); + return getBindableParameters().getParameter(bindableIndex); } diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/SimpleParameterAccessor.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/SimpleParameterAccessor.java index 5a0c067b2..b1a09ad7c 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/SimpleParameterAccessor.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/query/SimpleParameterAccessor.java @@ -90,20 +90,8 @@ public class SimpleParameterAccessor { private Object getBindableValue(int index) { - int bindableCount = 0; - for (Parameter parameter : parameters) { - - if (parameter.isBindable() && bindableCount == index) { - return values[parameter.getParameterIndex()]; - } - - if (parameter.isBindable()) { - bindableCount++; - } - } - - throw new IllegalArgumentException(); + return values[parameters.getBindableParameter(index).getIndex()]; } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java index 9557b66d9..53a53025a 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -102,9 +102,7 @@ public class ParametersUnitTests { String.class); Parameters parameters = new Parameters(method); - - assertThat(parameters.getParameter(0).getParameterIndex(), is(-1)); - assertThat(parameters.getParameter(1).getParameterIndex(), is(0)); + assertThat(parameters.getBindableParameter(0).getIndex(), is(1)); method = SampleDao.class.getMethod("validWithSortInBetween", @@ -112,9 +110,8 @@ public class ParametersUnitTests { parameters = new Parameters(method); - assertThat(parameters.getParameter(0).getParameterIndex(), is(0)); - assertThat(parameters.getParameter(1).getParameterIndex(), is(-1)); - assertThat(parameters.getParameter(2).getParameterIndex(), is(1)); + assertThat(parameters.getBindableParameter(0).getIndex(), is(0)); + assertThat(parameters.getBindableParameter(1).getIndex(), is(2)); }