From 8b9abe17cc4ecefa789c4cac910296e04fff5fc3 Mon Sep 17 00:00:00 2001 From: Myat Min Date: Fri, 31 Jul 2020 11:56:19 +0800 Subject: [PATCH 1/2] DATAJDBC-587 - Convert identity value object to SQL type with custom converter in FindAllByPath. --- .../convert/DefaultDataAccessStrategy.java | 5 +- .../DefaultDataAccessStrategyUnitTests.java | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java index 8b1e729f75..79dd8c6176 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java @@ -66,6 +66,7 @@ * @author Tyler Van Gorder * @author Milan Milanov * @author Myeonghyeon Lee + * @author Myat Min * @since 1.1 */ public class DefaultDataAccessStrategy implements DataAccessStrategy { @@ -367,7 +368,9 @@ private SqlParameterSource createParameterSource(Identifier identifier, Identifi SqlIdentifierParameterSource parameterSource = new SqlIdentifierParameterSource(identifierProcessing); - identifier.toMap().forEach(parameterSource::addValue); + identifier.toMap() + .forEach((sqlIdentifier, value) -> addConvertedPropertyValue(parameterSource, + sqlIdentifier, value, value.getClass())); return parameterSource; } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java index 42cdf12822..1da8dae8c2 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java @@ -24,8 +24,10 @@ import lombok.Data; import lombok.RequiredArgsConstructor; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import lombok.Value; import org.junit.Before; @@ -37,11 +39,14 @@ import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; +import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.dialect.HsqlDbDialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; +import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.KeyHolder; @@ -52,6 +57,7 @@ * @author Jens Schauder * @author Mark Paluch * @author Myeonghyeon Lee + * @author Myat Min */ public class DefaultDataAccessStrategyUnitTests { @@ -181,12 +187,64 @@ public void considersConfiguredWriteConverterForIdValueObjects() { assertThat(paramSourceCaptor.getValue().getValue("id")).isEqualTo(rawId); } + @Test // DATAJDBC-587 + public void considersConfiguredWriteConverterForIdValueObjectsWhichReferencedInOneToManyRelationship() { + + DelegatingDataAccessStrategy relationResolver = new DelegatingDataAccessStrategy(); + + Dialect dialect = HsqlDbDialect.INSTANCE; + + JdbcConverter converter = new BasicJdbcConverter(context, relationResolver, + new JdbcCustomConversions(Arrays.asList(IdValueToStringConverter.INSTANCE)), + new DefaultJdbcTypeFactory(jdbcOperations), dialect.getIdentifierProcessing()); + + DefaultDataAccessStrategy accessStrategy = new DefaultDataAccessStrategy( // + new SqlGeneratorSource(context, converter, dialect), // + context, // + converter, // + namedJdbcOperations); + + relationResolver.setDelegate(accessStrategy); + + String rawId = "batman"; + IdValue rootIdValue = new IdValue(rawId); + + DummyEntityRoot root = new DummyEntityRoot(rootIdValue); + DummyEntity child = new DummyEntity(ORIGINAL_ID); + root.dummyEntities.add(child); + + additionalParameters.put(SqlIdentifier.quoted("DUMMYENTITYROOT"), rootIdValue); + accessStrategy.insert(root, DummyEntityRoot.class, Identifier.from(additionalParameters)); + + verify(namedJdbcOperations).update(anyString(), paramSourceCaptor.capture(), + any(KeyHolder.class)); + + assertThat(paramSourceCaptor.getValue().getValue("id")).isEqualTo(rawId); + + PersistentPropertyPath path = + context.getPersistentPropertyPath("dummyEntities", DummyEntityRoot.class); + + accessStrategy.findAllByPath(Identifier.from(additionalParameters), path); + + verify(namedJdbcOperations).query(anyString(), paramSourceCaptor.capture(), + any(RowMapper.class)); + + assertThat(paramSourceCaptor.getValue().getValue("DUMMYENTITYROOT")).isEqualTo(rawId); + } + @RequiredArgsConstructor private static class DummyEntity { @Id private final Long id; } + @RequiredArgsConstructor // DATAJDBC-587 + private static class DummyEntityRoot { + + @Id private final IdValue id; + List dummyEntities = new ArrayList<>(); + } + @AllArgsConstructor private static class EntityWithBoolean { From 001b84b5d672c9bec657ed50c6c089fbc1577f9d Mon Sep 17 00:00:00 2001 From: Myat Min Date: Sun, 9 Aug 2020 14:22:42 +0800 Subject: [PATCH 2/2] Convert identity value object to SQL type in Delete by propery path --- .../data/jdbc/core/convert/DefaultDataAccessStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java index 79dd8c6176..b70eb5f19e 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java @@ -228,7 +228,7 @@ public void delete(Object rootId, PersistentPropertyPath