From 70e2f2d1db6b91b3452266c223726116237b59d9 Mon Sep 17 00:00:00 2001 From: Mikhail2048 Date: Sat, 7 Sep 2024 10:30:54 +0300 Subject: [PATCH] Added converter for SQL Server dialect --- .../core/dialect/JdbcSqlServerDialect.java | 14 ++++++++++ .../dialect/JdbcSqlServerDialectTest.java | 26 +++++++++++++++++++ .../data/jdbc/testing/EnabledOnDatabase.java | 2 +- .../data/jdbc/testing/IntegrationTest.java | 2 +- .../core/dialect/SqlServerDialect.java | 15 +++-------- 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialectTest.java diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java index c67e32e0f5..2eaca96d49 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java @@ -17,6 +17,7 @@ import microsoft.sql.DateTimeOffset; +import java.time.Instant; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collection; @@ -31,6 +32,7 @@ * * @author Jens Schauder * @author Christoph Strobl + * @author Mikhail Polivakha * @since 2.3 */ public class JdbcSqlServerDialect extends SqlServerDialect { @@ -42,6 +44,7 @@ public Collection getConverters() { List converters = new ArrayList<>(super.getConverters()); converters.add(DateTimeOffsetToOffsetDateTimeConverter.INSTANCE); + converters.add(DateTimeOffsetToInstantConverter.INSTANCE); return converters; } @@ -55,4 +58,15 @@ public OffsetDateTime convert(DateTimeOffset source) { return source.getOffsetDateTime(); } } + + @ReadingConverter + enum DateTimeOffsetToInstantConverter implements Converter { + + INSTANCE; + + @Override + public Instant convert(DateTimeOffset source) { + return source.getOffsetDateTime().toInstant(); + } + } } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialectTest.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialectTest.java new file mode 100644 index 0000000000..aee7e1fd76 --- /dev/null +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialectTest.java @@ -0,0 +1,26 @@ +package org.springframework.data.jdbc.core.dialect; + +import java.time.Instant; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.data.jdbc.core.convert.JdbcCustomConversions; + +/** + * Tests for {@link JdbcSqlServerDialect} + * + * @author Mikhail Polivakha + */ +class JdbcSqlServerDialectTest { + + @Test + void testCustomConversions() { + JdbcCustomConversions jdbcCustomConversions = new JdbcCustomConversions( + (List) JdbcSqlServerDialect.INSTANCE.getConverters()); + + Assertions + .assertThat(jdbcCustomConversions.hasCustomReadTarget(microsoft.sql.DateTimeOffset.class, Instant.class)) + .isTrue(); + } +} \ No newline at end of file diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/EnabledOnDatabase.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/EnabledOnDatabase.java index 890796abe0..7c2e09aef8 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/EnabledOnDatabase.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/EnabledOnDatabase.java @@ -44,7 +44,7 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -// required twice as the annotation lookup doesn't merge multiple occurences of the same annotation +// required twice as the annotation lookup doesn't merge multiple occurrences of the same annotation @ContextCustomizerFactories(value = { TestClassCustomizerFactory.class, EnabledOnDatabaseCustomizerFactory.class }) @Documented @Inherited diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/IntegrationTest.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/IntegrationTest.java index cf8dae7000..1f161e93a4 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/IntegrationTest.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/IntegrationTest.java @@ -49,7 +49,7 @@ * @see EnabledOnDatabase */ @TestExecutionListeners(value = AssumeFeatureTestExecutionListener.class, mergeMode = MERGE_WITH_DEFAULTS) -// required twice as the annotation lookup doesn't merge multiple occurences of the same annotation +// required twice as the annotation lookup doesn't merge multiple occurrences of the same annotation @ContextCustomizerFactories(value = { TestClassCustomizerFactory.class, EnabledOnDatabaseCustomizerFactory.class }) @ActiveProfiles(resolver = CombiningActiveProfileResolver.class) @ExtendWith(SpringExtension.class) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index 3df1140719..ab6a3fc033 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -81,17 +81,10 @@ public Position getClausePosition() { @Override public String getLock(LockOptions lockOptions) { - switch (lockOptions.getLockMode()) { - - case PESSIMISTIC_WRITE: - return "WITH (UPDLOCK, ROWLOCK)"; - - case PESSIMISTIC_READ: - return "WITH (HOLDLOCK, ROWLOCK)"; - - default: - return ""; - } + return switch (lockOptions.getLockMode()) { + case PESSIMISTIC_WRITE -> "WITH (UPDLOCK, ROWLOCK)"; + case PESSIMISTIC_READ -> "WITH (HOLDLOCK, ROWLOCK)"; + }; } @Override