Skip to content

Commit feb630a

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 00c0a27 commit feb630a

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
@@ -296,17 +296,15 @@ public <T> Page<T> findAll(Class<T> domainType, Pageable pageable) {
296296

297297
@Override
298298
public <T> Optional<T> findOne(Query query, Class<T> domainType) {
299-
return accessStrategy.findOne(query, domainType);
299+
return accessStrategy.findOne(query, domainType).map(this::triggerAfterConvert);
300300
}
301301

302302
@Override
303303
public <T> List<T> findAll(Query query, Class<T> domainType) {
304304

305305
Iterable<T> all = accessStrategy.findAll(query, domainType);
306-
if (all instanceof List<T> list) {
307-
return list;
308-
}
309-
return Streamable.of(all).toList();
306+
307+
return triggerAfterConvert(all);
310308
}
311309

312310
@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)