Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,12 @@ private void setParameter(BindableQuery query, Object value, ErrorHandler errorH
} else {

Integer position = parameter.getPosition();
boolean canBindByPosition = query.hasPositionParameters()
? query.hasParameterPosition(position) || errorHandler == LENIENT || errorHandler == STRICT
: query.getParameters().size() >= position || errorHandler == LENIENT;

if (position != null //
&& (query.getParameters().size() >= position //
|| errorHandler == LENIENT //
&& (canBindByPosition //
|| query.registerExcessParameters())) {
query.setParameter(position, value);
}
Expand Down Expand Up @@ -163,11 +165,13 @@ private void setParameter(BindableQuery query, Date date, ErrorHandler errorHand
} else {

Integer position = parameter.getPosition();
boolean canBindByPosition = query.hasPositionParameters()
? query.hasParameterPosition(position) || errorHandler == LENIENT || errorHandler == STRICT
: query.getParameters().size() >= position || errorHandler == LENIENT;

if (position != null //
&& (query.getParameters().size() >= parameter.getPosition() //
|| query.registerExcessParameters() //
|| errorHandler == LENIENT)) {
&& (canBindByPosition //
|| query.registerExcessParameters())) {

query.setParameter(parameter.getPosition(), date, temporalType);
}
Expand Down Expand Up @@ -242,6 +246,25 @@ public boolean registerExcessParameters() {
return this.registerExcessParameters;
}

boolean hasPositionParameters() {
for (Parameter<?> candidate : parameters) {
if (candidate.getPosition() != null) {
return true;
}
}
return false;
}

boolean hasParameterPosition(int position) {
for (Parameter<?> candidate : parameters) {
Integer candidatePosition = candidate.getPosition();
if (candidatePosition != null && candidatePosition == position) {
return true;
}
}
return false;
}

/**
* Returns the actual target {@link Query} instance, even if the provided query is a {@link Proxy} based on
* {@link org.springframework.orm.jpa.SharedEntityManagerCreator.DeferredQueryInvocationHandler}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,30 @@ void lenientSetsParameterWhenSuccessIsUnsure() {

}

@Test // DATAJPA-4167
void setsParameterWhenQueryExposesOnlySecondPosition() {

Query query = mock(Query.class);
doReturn(Collections.singleton(new ParameterImpl(null, 2))).when(query).getParameters();

for (TemporalType temporalType : temporalTypes) {

QueryParameterSetter setter = QueryParameterSetter.create( //
firstValueExtractor, //
new ParameterImpl(null, 2), //
temporalType //
);

setter.setParameter(QueryParameterSetter.BindableQuery.from(query), methodArguments, STRICT);

if (temporalType == null) {
verify(query).setParameter(eq(2), any(Date.class));
} else {
verify(query).setParameter(eq(2), any(Date.class), eq(temporalType));
}
}
}

/**
* This scenario happens when the only (name) parameter is part of an ORDER BY clause and gets stripped of for the
* count query. Then the count query has no named parameter but the parameter provided has a {@literal null} position.
Expand Down
Loading