Browse Source

Invoke callbacks for find by Query methods.

Callback handlers are now properly called for findAll/One with Query parameter.

Closes #1979
pull/2110/head
Jens Schauder 11 months ago
parent
commit
1c9c014fa0
No known key found for this signature in database
GPG Key ID: 74F6C554AE971567
  1. 8
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java
  2. 51
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java

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

@ -320,17 +320,15 @@ public class JdbcAggregateTemplate implements JdbcAggregateOperations { @@ -320,17 +320,15 @@ public class JdbcAggregateTemplate implements JdbcAggregateOperations {
@Override
public <T> Optional<T> findOne(Query query, Class<T> domainType) {
return accessStrategy.findOne(query, domainType);
return accessStrategy.findOne(query, domainType).map(this::triggerAfterConvert);
}
@Override
public <T> List<T> findAll(Query query, Class<T> domainType) {
Iterable<T> all = accessStrategy.findAll(query, domainType);
if (all instanceof List<T> list) {
return list;
}
return Streamable.of(all).toList();
return triggerAfterConvert(all);
}
@Override

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

@ -47,8 +47,11 @@ import org.springframework.data.relational.core.mapping.event.AfterSaveCallback; @@ -47,8 +47,11 @@ import org.springframework.data.relational.core.mapping.event.AfterSaveCallback;
import org.springframework.data.relational.core.mapping.event.BeforeConvertCallback;
import org.springframework.data.relational.core.mapping.event.BeforeDeleteCallback;
import org.springframework.data.relational.core.mapping.event.BeforeSaveCallback;
import org.springframework.data.relational.core.query.Criteria;
import org.springframework.data.relational.core.query.Query;
import java.util.List;
import java.util.Optional;
/**
* Unit tests for {@link JdbcAggregateTemplate}.
@ -299,12 +302,13 @@ public class JdbcAggregateTemplateUnitTests { @@ -299,12 +302,13 @@ public class JdbcAggregateTemplateUnitTests {
SampleEntity neumann1 = new SampleEntity(42L, "Neumann");
SampleEntity neumann2 = new SampleEntity(42L, "Alfred E. Neumann");
when(dataAccessStrategy.findAll(SampleEntity.class, PageRequest.of(0, 20))).thenReturn(asList(alfred1, neumann1));
PageRequest pageRequest = PageRequest.of(0, 20);
when(dataAccessStrategy.findAll(SampleEntity.class, pageRequest)).thenReturn(asList(alfred1, neumann1));
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
when(callbacks.callback(any(Class.class), eq(neumann1), any(Object[].class))).thenReturn(neumann2);
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, PageRequest.of(0, 20));
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, pageRequest);
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
@ -312,6 +316,49 @@ public class JdbcAggregateTemplateUnitTests { @@ -312,6 +316,49 @@ public class JdbcAggregateTemplateUnitTests {
assertThat(all).containsExactly(alfred2, neumann2);
}
@Test // GH-1979
void callbackOnFindAllByQuery() {
SampleEntity alfred1 = new SampleEntity(23L, "Alfred");
SampleEntity alfred2 = new SampleEntity(23L, "Alfred E.");
SampleEntity neumann1 = new SampleEntity(42L, "Neumann");
SampleEntity neumann2 = new SampleEntity(42L, "Alfred E. Neumann");
Query query = Query.query(Criteria.where("not relevant").is("for test"));
when(dataAccessStrategy.findAll(query, SampleEntity.class)).thenReturn(asList(alfred1, neumann1));
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
when(callbacks.callback(any(Class.class), eq(neumann1), any(Object[].class))).thenReturn(neumann2);
Iterable<SampleEntity> all = template.findAll(query, SampleEntity.class);
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
assertThat(all).containsExactly(alfred2, neumann2);
}
@Test // GH-1979
void callbackOnFindOneByQuery() {
SampleEntity alfred1 = new SampleEntity(23L, "Alfred");
SampleEntity alfred2 = new SampleEntity(23L, "Alfred E.");
Query query = Query.query(Criteria.where("not relevant").is("for test"));
when(dataAccessStrategy.findOne(query, SampleEntity.class)).thenReturn(Optional.of(alfred1));
when(callbacks.callback(any(Class.class), eq(alfred1), any(Object[].class))).thenReturn(alfred2);
Optional<SampleEntity> all = template.findOne(query, SampleEntity.class);
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
assertThat(all).contains(alfred2);
}
@Test // GH-1401
void saveAllWithEmptyListDoesNothing() {
assertThat(template.saveAll(emptyList())).isEmpty();

Loading…
Cancel
Save