Skip to content

Commit 1c9c014

Browse files
committed
Invoke callbacks for find by Query methods.
Callback handlers are now properly called for findAll/One with Query parameter. Closes #1979
1 parent 96dad1e commit 1c9c014

File tree

2 files changed

+52
-7
lines changed

2 files changed

+52
-7
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -320,17 +320,15 @@ public <T> Page<T> findAll(Class<T> domainType, Pageable pageable) {
320320

321321
@Override
322322
public <T> Optional<T> findOne(Query query, Class<T> domainType) {
323-
return accessStrategy.findOne(query, domainType);
323+
return accessStrategy.findOne(query, domainType).map(this::triggerAfterConvert);
324324
}
325325

326326
@Override
327327
public <T> List<T> findAll(Query query, Class<T> domainType) {
328328

329329
Iterable<T> all = accessStrategy.findAll(query, domainType);
330-
if (all instanceof List<T> list) {
331-
return list;
332-
}
333-
return Streamable.of(all).toList();
330+
331+
return triggerAfterConvert(all);
334332
}
335333

336334
@Override

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java

+49-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@
4747
import org.springframework.data.relational.core.mapping.event.BeforeConvertCallback;
4848
import org.springframework.data.relational.core.mapping.event.BeforeDeleteCallback;
4949
import org.springframework.data.relational.core.mapping.event.BeforeSaveCallback;
50+
import org.springframework.data.relational.core.query.Criteria;
51+
import org.springframework.data.relational.core.query.Query;
5052

5153
import java.util.List;
54+
import java.util.Optional;
5255

5356
/**
5457
* Unit tests for {@link JdbcAggregateTemplate}.
@@ -299,19 +302,63 @@ void callbackOnLoadPaged() {
299302
SampleEntity neumann1 = new SampleEntity(42L, "Neumann");
300303
SampleEntity neumann2 = new SampleEntity(42L, "Alfred E. Neumann");
301304

302-
when(dataAccessStrategy.findAll(SampleEntity.class, PageRequest.of(0, 20))).thenReturn(asList(alfred1, neumann1));
305+
PageRequest pageRequest = PageRequest.of(0, 20);
306+
when(dataAccessStrategy.findAll(SampleEntity.class, pageRequest)).thenReturn(asList(alfred1, neumann1));
303307

304308
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
305309
when(callbacks.callback(any(Class.class), eq(neumann1), any(Object[].class))).thenReturn(neumann2);
306310

307-
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, PageRequest.of(0, 20));
311+
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, pageRequest);
308312

309313
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
310314
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
311315

312316
assertThat(all).containsExactly(alfred2, neumann2);
313317
}
314318

319+
@Test // GH-1979
320+
void callbackOnFindAllByQuery() {
321+
322+
SampleEntity alfred1 = new SampleEntity(23L, "Alfred");
323+
SampleEntity alfred2 = new SampleEntity(23L, "Alfred E.");
324+
325+
SampleEntity neumann1 = new SampleEntity(42L, "Neumann");
326+
SampleEntity neumann2 = new SampleEntity(42L, "Alfred E. Neumann");
327+
328+
Query query = Query.query(Criteria.where("not relevant").is("for test"));
329+
330+
when(dataAccessStrategy.findAll(query, SampleEntity.class)).thenReturn(asList(alfred1, neumann1));
331+
332+
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
333+
when(callbacks.callback(any(Class.class), eq(neumann1), any(Object[].class))).thenReturn(neumann2);
334+
335+
Iterable<SampleEntity> all = template.findAll(query, SampleEntity.class);
336+
337+
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
338+
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
339+
340+
assertThat(all).containsExactly(alfred2, neumann2);
341+
}
342+
343+
@Test // GH-1979
344+
void callbackOnFindOneByQuery() {
345+
346+
SampleEntity alfred1 = new SampleEntity(23L, "Alfred");
347+
SampleEntity alfred2 = new SampleEntity(23L, "Alfred E.");
348+
349+
Query query = Query.query(Criteria.where("not relevant").is("for test"));
350+
351+
when(dataAccessStrategy.findOne(query, SampleEntity.class)).thenReturn(Optional.of(alfred1));
352+
353+
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
354+
355+
Optional<SampleEntity> all = template.findOne(query, SampleEntity.class);
356+
357+
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
358+
359+
assertThat(all).contains(alfred2);
360+
}
361+
315362
@Test // GH-1401
316363
void saveAllWithEmptyListDoesNothing() {
317364
assertThat(template.saveAll(emptyList())).isEmpty();

0 commit comments

Comments
 (0)