@@ -109,10 +109,12 @@ private void setParameter(BindableQuery query, Object value, ErrorHandler errorH
109109 } else {
110110
111111 Integer position = parameter .getPosition ();
112+ boolean canBindByPosition = query .hasPositionParameters ()
113+ ? query .hasParameterPosition (position ) || errorHandler == LENIENT || errorHandler == STRICT
114+ : query .getParameters ().size () >= position || errorHandler == LENIENT ;
112115
113116 if (position != null //
114- && (query .getParameters ().size () >= position //
115- || errorHandler == LENIENT //
117+ && (canBindByPosition //
116118 || query .registerExcessParameters ())) {
117119 query .setParameter (position , value );
118120 }
@@ -163,11 +165,13 @@ private void setParameter(BindableQuery query, Date date, ErrorHandler errorHand
163165 } else {
164166
165167 Integer position = parameter .getPosition ();
168+ boolean canBindByPosition = query .hasPositionParameters ()
169+ ? query .hasParameterPosition (position ) || errorHandler == LENIENT || errorHandler == STRICT
170+ : query .getParameters ().size () >= position || errorHandler == LENIENT ;
166171
167172 if (position != null //
168- && (query .getParameters ().size () >= parameter .getPosition () //
169- || query .registerExcessParameters () //
170- || errorHandler == LENIENT )) {
173+ && (canBindByPosition //
174+ || query .registerExcessParameters ())) {
171175
172176 query .setParameter (parameter .getPosition (), date , temporalType );
173177 }
@@ -242,6 +246,25 @@ public boolean registerExcessParameters() {
242246 return this .registerExcessParameters ;
243247 }
244248
249+ boolean hasPositionParameters () {
250+ for (Parameter <?> candidate : parameters ) {
251+ if (candidate .getPosition () != null ) {
252+ return true ;
253+ }
254+ }
255+ return false ;
256+ }
257+
258+ boolean hasParameterPosition (int position ) {
259+ for (Parameter <?> candidate : parameters ) {
260+ Integer candidatePosition = candidate .getPosition ();
261+ if (candidatePosition != null && candidatePosition == position ) {
262+ return true ;
263+ }
264+ }
265+ return false ;
266+ }
267+
245268 /**
246269 * Returns the actual target {@link Query} instance, even if the provided query is a {@link Proxy} based on
247270 * {@link org.springframework.orm.jpa.SharedEntityManagerCreator.DeferredQueryInvocationHandler}.
0 commit comments