diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java index 893cf561..06a3e4d1 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java @@ -57,6 +57,7 @@ import org.springframework.util.Assert; * @author Mark Paluch * @author Jens Schauder * @author Christoph Strobl + * @author Myeonghyeon Lee * @since 1.1 * @see MappingContext * @see SimpleTypeHolder @@ -130,6 +131,9 @@ public class BasicJdbcConverter extends BasicRelationalConverter implements Jdbc } if (AggregateReference.class.isAssignableFrom(type.getType())) { + if (type.getType().isAssignableFrom(value.getClass())) { + return value; + } return readAggregateReference(value, type); } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/EntityRowMapperUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/EntityRowMapperUnitTests.java index 8c24ad3b..202b607c 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/EntityRowMapperUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/EntityRowMapperUnitTests.java @@ -51,6 +51,7 @@ import org.mockito.stubbing.Answer; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.jdbc.core.mapping.AggregateReference; import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.relational.core.mapping.Embedded; @@ -71,6 +72,7 @@ import org.springframework.util.Assert; * @author Maciej Walkowiak * @author Bastian Wilhelm * @author Christoph Strobl + * @author Myeonghyeon Lee */ public class EntityRowMapperUnitTests { @@ -129,6 +131,21 @@ public class EntityRowMapperUnitTests { .containsExactly(ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha"); } + @Test // DATAJDBC-427 + public void simpleWithReferenceGetProperlyExtracted() throws SQLException { + + ResultSet rs = mockResultSet(asList("id", "name", "trivial_id"), // + ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha", 100L); + rs.next(); + + WithReference extracted = createRowMapper(WithReference.class).mapRow(rs, 1); + + assertThat(extracted) // + .isNotNull() // + .extracting(e -> e.id, e -> e.name, e -> e.trivialId) // + .containsExactly(ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha", AggregateReference.to(100L)); + } + @Test // DATAJDBC-113 public void simpleOneToOneGetsProperlyExtracted() throws SQLException { @@ -159,6 +176,21 @@ public class EntityRowMapperUnitTests { .containsExactly(ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha", 24L, "beta"); } + @Test // DATAJDBC-427 + public void immutableWithReferenceGetsProperlyExtracted() throws SQLException { + + ResultSet rs = mockResultSet(asList("id", "name", "trivial_id"), // + ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha", 100L); + rs.next(); + + WithReferenceImmutable extracted = createRowMapper(WithReferenceImmutable.class).mapRow(rs, 1); + + assertThat(extracted) // + .isNotNull() // + .extracting(e -> e.id, e -> e.name, e -> e.trivialId) // + .containsExactly(ID_FOR_ENTITY_NOT_REFERENCING_MAP, "alpha", AggregateReference.to(100L)); + } + // TODO add additional test for multilevel embeddables @Test // DATAJDBC-111 public void simpleEmbeddedGetsProperlyExtracted() throws SQLException { @@ -440,6 +472,26 @@ public class EntityRowMapperUnitTests { String name; } + @EqualsAndHashCode + @NoArgsConstructor + @AllArgsConstructor + @Getter + static class WithReference { + + @Id Long id; + String name; + AggregateReference trivialId; + } + + @Wither + @RequiredArgsConstructor + static class WithReferenceImmutable { + + @Id private final Long id; + private final String name; + private final AggregateReference trivialId; + } + static class OneToOne { @Id Long id;