Skip to content

Commit e5bcc4a

Browse files
schaudermp911de
authored andcommitted
Fix loading of nested embedded entities.
Closes #1676 Original pull request: #1685
1 parent 58d344a commit e5bcc4a

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryEmbeddedIntegrationTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,21 @@ public void findAllFindsAllEntities() {
114114
.containsExactlyInAnyOrder(entity.getId(), other.getId());
115115
}
116116

117+
@Test // GH-1676
118+
public void findAllFindsAllEntitiesWithOnlyReferenceNotNull() {
119+
120+
DummyEntity entity = createDummyEntity();
121+
entity.prefixedEmbeddable.test = null;
122+
entity = repository.save(entity);
123+
DummyEntity other = repository.save(createDummyEntity());
124+
125+
Iterable<DummyEntity> all = repository.findAll();
126+
127+
assertThat(all)//
128+
.extracting(DummyEntity::getId)//
129+
.containsExactlyInAnyOrder(entity.getId(), other.getId());
130+
}
131+
117132
@Test // DATAJDBC-111
118133
public void findByIdReturnsEmptyWhenNoneFound() {
119134

spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java

+17-14
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,7 @@
4141
import org.springframework.data.mapping.PersistentPropertyAccessor;
4242
import org.springframework.data.mapping.PersistentPropertyPathAccessor;
4343
import org.springframework.data.mapping.context.MappingContext;
44-
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
45-
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
46-
import org.springframework.data.mapping.model.EntityInstantiator;
47-
import org.springframework.data.mapping.model.ParameterValueProvider;
48-
import org.springframework.data.mapping.model.PersistentEntityParameterValueProvider;
49-
import org.springframework.data.mapping.model.PropertyValueProvider;
50-
import org.springframework.data.mapping.model.SimpleTypeHolder;
51-
import org.springframework.data.mapping.model.SpELContext;
52-
import org.springframework.data.mapping.model.SpELExpressionEvaluator;
53-
import org.springframework.data.mapping.model.SpELExpressionParameterValueProvider;
44+
import org.springframework.data.mapping.model.*;
5445
import org.springframework.data.projection.EntityProjection;
5546
import org.springframework.data.projection.EntityProjectionIntrospector;
5647
import org.springframework.data.projection.EntityProjectionIntrospector.ProjectionPredicate;
@@ -561,15 +552,16 @@ private Object readEmbedded(ConversionContext conversionContext, RelationalPrope
561552
RowDocumentAccessor source, RelationalPersistentProperty property,
562553
RelationalPersistentEntity<?> persistentEntity) {
563554

564-
if (shouldReadEmbeddable(conversionContext, property, persistentEntity, provider)) {
555+
if (shouldReadEmbeddable(conversionContext, property, persistentEntity, provider, source)) {
565556
return read(conversionContext, persistentEntity, source);
566557
}
567558

568559
return null;
569560
}
570561

571562
private boolean shouldReadEmbeddable(ConversionContext context, RelationalPersistentProperty property,
572-
RelationalPersistentEntity<?> unwrappedEntity, RelationalPropertyValueProvider propertyValueProvider) {
563+
RelationalPersistentEntity<?> unwrappedEntity, RelationalPropertyValueProvider propertyValueProvider,
564+
RowDocumentAccessor source) {
573565

574566
OnEmpty onEmpty = property.getRequiredAnnotation(Embedded.class).onEmpty();
575567

@@ -579,8 +571,19 @@ private boolean shouldReadEmbeddable(ConversionContext context, RelationalPersis
579571

580572
for (RelationalPersistentProperty persistentProperty : unwrappedEntity) {
581573

582-
RelationalPropertyValueProvider contextual = propertyValueProvider
583-
.withContext(context.forProperty(persistentProperty));
574+
ConversionContext nestedContext = context.forProperty(persistentProperty);
575+
RelationalPropertyValueProvider contextual = propertyValueProvider.withContext(nestedContext);
576+
577+
if (persistentProperty.isEmbedded()) {
578+
579+
TypeInformation<?> typeInformation = persistentProperty.getTypeInformation();
580+
581+
RelationalPersistentEntity<?> nestedEntity = getMappingContext().getPersistentEntity(typeInformation);
582+
583+
if (readEmbedded(nestedContext, contextual, source, persistentProperty, nestedEntity) != null) {
584+
return true;
585+
}
586+
}
584587

585588
if (contextual.hasValue(persistentProperty)) {
586589
return true;

0 commit comments

Comments
 (0)