diff --git a/pom.xml b/pom.xml index e94e7af..5d98456 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,11 @@ ${springdata.relational} + + org.springframework + spring-r2dbc + + org.springframework spring-tx diff --git a/src/main/asciidoc/index.adoc b/src/main/asciidoc/index.adoc index 18e5f7e..16c2c6f 100644 --- a/src/main/asciidoc/index.adoc +++ b/src/main/asciidoc/index.adoc @@ -52,3 +52,4 @@ include::reference/kotlin.adoc[leveloffset=+1] :numbered!: include::{spring-data-commons-docs}/repository-query-keywords-reference.adoc[leveloffset=+1] include::{spring-data-commons-docs}/repository-query-return-types-reference.adoc[leveloffset=+1] +include::reference/r2dbc-upgrading.adoc[leveloffset=+1] diff --git a/src/main/asciidoc/reference/r2dbc-upgrading.adoc b/src/main/asciidoc/reference/r2dbc-upgrading.adoc new file mode 100644 index 0000000..2bda475 --- /dev/null +++ b/src/main/asciidoc/reference/r2dbc-upgrading.adoc @@ -0,0 +1,48 @@ +[appendix] += Migration Guide + +The following sections explain how to migrate to a newer version of Spring Data R2DBC. + +[[upgrading.1.1-1.2]] +== Upgrading from 1.1.x to 1.2.x + +Spring Data R2DBC was developed with the intent to evaluate how well R2DBC can integrate with Spring applications. +One of the main aspects was to move core support into Spring Framework once R2DBC support has proven useful. +Spring Framework 5.3 ships with a new module: Spring R2DBC. + +`spring-r2dbc` ships core R2DBC functionality (a slim variant of `DatabaseClient`, Transaction Manager, Connection Factory initialization, Exception translation) that was initially provided by Spring Data R2DBC. The 1.2.0 release aligns with what's provided in Spring R2DBC by making several changes outlined in the following sections. + +[[upgrading.1.1-1.2.deprecation]] +=== Deprecations + +* Deprecation of `o.s.d.r2dbc.core.DatabaseClient` and its support classes `ConnectionAccessor`, `FetchSpec`, `SqlProvider` and a few more. +Named parameter support classes such as `NamedParameterExpander` are encapsulated by Spring R2DBC's `DatabaseClient` implementation hence we're not providing replacements as this was internal API in the first place. +Use `o.s.r2dbc.core.DatabaseClient` and their Spring R2DBC replacements available from `org.springframework.r2dbc.core`. +Entity-based methods (`select`/`insert`/`update`/`delete`) methods are available through `R2dbcEntityTemplate` which was introduced with version 1.1. +* Deprecation of `o.s.d.r2dbc.connectionfactory`, `o.s.d.r2dbc.connectionfactory.init`, and `o.s.d.r2dbc.connectionfactory.lookup` packages. +Use Spring R2DBC's variant which you can find at `o.s.r2dbc.connection`. +* Deprecation of `o.s.d.r2dbc.convert.ColumnMapRowMapper`. +Use `o.s.r2dbc.core.ColumnMapRowMapper` instead. +* Deprecation of binding support classes `o.s.d.r2dbc.dialect.Bindings`, `BindMarker`, `BindMarkers`, `BindMarkersFactory` and related types. +Use replacements from `org.springframework.r2dbc.core.binding`. +* Deprecation of `BadSqlGrammarException`, `UncategorizedR2dbcException` and exception translation at `o.s.d.r2dbc.support`. +Spring R2DBC provides a slim exception translation variant without an SPI for now available through `o.s.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException`. + +[[upgrading.1.1-1.2.replacements]] +=== Usage of replacements provided by Spring R2DBC + +To ease migration, several deprecated types are now subtypes of their replacements provided by Spring R2DBC. Spring Data R2DBC has changes several methods or introduced new methods accepting Spring R2DBC types. +Specifically the following classes are affected: + +* `R2dbcEntityTemplate` +* `R2dbcDialect` +* Types in `org.springframework.data.r2dbc.query` + +We recommend that you review your imports if you work with these types directly. + +[[upgrading.1.1-1.2.dependencies]] +=== Dependency Changes + +To make use of Spring R2DBC, make sure to include the following dependency: + +* `org.springframework:spring-r2dbc` diff --git a/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java b/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java index 779cea7..6368641 100644 --- a/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java +++ b/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java @@ -17,8 +17,6 @@ package org.springframework.data.r2dbc; import io.r2dbc.spi.R2dbcException; -import org.springframework.dao.InvalidDataAccessResourceUsageException; - /** * Exception thrown when SQL specified is invalid. Such exceptions always have a {@link io.r2dbc.spi.R2dbcException} * root cause. @@ -28,13 +26,13 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; * without affecting code using this class. * * @author Mark Paluch + * @deprecated since 1.2, use directly Spring R2DBC's {@link org.springframework.r2dbc.BadSqlGrammarException} instead. */ -public class BadSqlGrammarException extends InvalidDataAccessResourceUsageException { +@Deprecated +public class BadSqlGrammarException extends org.springframework.r2dbc.BadSqlGrammarException { private static final long serialVersionUID = 3814579246913482054L; - private final String sql; - /** * Creates a new {@link BadSqlGrammarException}. * @@ -43,10 +41,7 @@ public class BadSqlGrammarException extends InvalidDataAccessResourceUsageExcept * @param ex the root cause. */ public BadSqlGrammarException(String task, String sql, R2dbcException ex) { - - super(task + "; bad SQL grammar [" + sql + "]", ex); - - this.sql = sql; + super(task, sql, ex); } /** @@ -60,6 +55,6 @@ public class BadSqlGrammarException extends InvalidDataAccessResourceUsageExcept * Return the SQL that caused the problem. */ public String getSql() { - return this.sql; + return super.getSql(); } } diff --git a/src/main/java/org/springframework/data/r2dbc/InvalidResultAccessException.java b/src/main/java/org/springframework/data/r2dbc/InvalidResultAccessException.java index e79f59e..8ac229d 100644 --- a/src/main/java/org/springframework/data/r2dbc/InvalidResultAccessException.java +++ b/src/main/java/org/springframework/data/r2dbc/InvalidResultAccessException.java @@ -24,13 +24,15 @@ import org.springframework.lang.Nullable; * Exception thrown when a {@link io.r2dbc.spi.Result} has been accessed in an invalid fashion. Such exceptions always * have a {@link io.r2dbc.spi.R2dbcException} root cause. *

- * This typically happens when an invalid {@link org.springframework.data.r2dbc.core.FetchSpec} column index or name - * has been specified. + * This typically happens when an invalid {@link org.springframework.data.r2dbc.core.FetchSpec} column index or name has + * been specified. * * @author Mark Paluch * @see BadSqlGrammarException + * @deprecated since 1.2, not in use anymore. */ @SuppressWarnings("serial") +@Deprecated public class InvalidResultAccessException extends InvalidDataAccessResourceUsageException { private final @Nullable String sql; diff --git a/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java b/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java index d74bd5b..e54b282 100644 --- a/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java +++ b/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java @@ -17,23 +17,19 @@ package org.springframework.data.r2dbc; import io.r2dbc.spi.R2dbcException; -import org.springframework.dao.UncategorizedDataAccessException; import org.springframework.lang.Nullable; /** * Exception thrown when we can't classify a {@link R2dbcException} into one of our generic data access exceptions. * * @author Mark Paluch + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.UncategorizedR2dbcException} instead. */ -public class UncategorizedR2dbcException extends UncategorizedDataAccessException { +@Deprecated +public class UncategorizedR2dbcException extends org.springframework.r2dbc.UncategorizedR2dbcException { private static final long serialVersionUID = 361587356435210266L; - /** - * SQL that led to the problem - */ - private final @Nullable String sql; - /** * Creates a new {@link UncategorizedR2dbcException}. * @@ -42,10 +38,7 @@ public class UncategorizedR2dbcException extends UncategorizedDataAccessExceptio * @param ex the root cause */ public UncategorizedR2dbcException(String task, @Nullable String sql, R2dbcException ex) { - - super(String.format("%s; uncategorized R2dbcException%s; %s", task, sql != null ? " for SQL [" + sql + "]" : "", - ex.getMessage()), ex); - this.sql = sql; + super(task, sql, ex); } /** @@ -62,6 +55,6 @@ public class UncategorizedR2dbcException extends UncategorizedDataAccessExceptio */ @Nullable public String getSql() { - return this.sql; + return super.getSql(); } } diff --git a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java index 765160e..379c5df 100644 --- a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java +++ b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java @@ -40,8 +40,6 @@ import org.springframework.data.r2dbc.dialect.DialectResolver; import org.springframework.data.r2dbc.dialect.R2dbcDialect; import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; import org.springframework.data.r2dbc.support.R2dbcExceptionSubclassTranslator; -import org.springframework.data.r2dbc.support.R2dbcExceptionTranslator; -import org.springframework.data.r2dbc.support.SqlStateR2dbcExceptionTranslator; import org.springframework.data.relational.core.conversion.BasicRelationalConverter; import org.springframework.data.relational.core.mapping.NamingStrategy; import org.springframework.lang.Nullable; @@ -100,11 +98,9 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw * @throws IllegalArgumentException if any of the required args is {@literal null}. */ @Bean({ "r2dbcDatabaseClient", "databaseClient" }) - public DatabaseClient databaseClient(ReactiveDataAccessStrategy dataAccessStrategy, - R2dbcExceptionTranslator exceptionTranslator) { + public DatabaseClient databaseClient(ReactiveDataAccessStrategy dataAccessStrategy) { Assert.notNull(dataAccessStrategy, "DataAccessStrategy must not be null!"); - Assert.notNull(exceptionTranslator, "ExceptionTranslator must not be null!"); SpelAwareProxyProjectionFactory projectionFactory = new SpelAwareProxyProjectionFactory(); if (context != null) { @@ -115,7 +111,7 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw return DatabaseClient.builder() // .connectionFactory(lookupConnectionFactory()) // .dataAccessStrategy(dataAccessStrategy) // - .exceptionTranslator(exceptionTranslator) // + .exceptionTranslator(new R2dbcExceptionSubclassTranslator()) // .projectionFactory(projectionFactory) // .build(); } @@ -200,19 +196,6 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw return StoreConversions.of(dialect.getSimpleTypeHolder(), converters); } - /** - * Creates a {@link R2dbcExceptionTranslator} using the configured {@link #connectionFactory() ConnectionFactory}. - * - * @return must not be {@literal null}. - * @see #connectionFactory() - * @see R2dbcExceptionSubclassTranslator - * @see SqlStateR2dbcExceptionTranslator - */ - @Bean - public R2dbcExceptionTranslator exceptionTranslator() { - return new R2dbcExceptionSubclassTranslator(); - } - ConnectionFactory lookupConnectionFactory() { ApplicationContext context = this.context; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionFactoryUtils.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionFactoryUtils.java index 871077f..731e425 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionFactoryUtils.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionFactoryUtils.java @@ -39,7 +39,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Christoph Strobl + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public abstract class ConnectionFactoryUtils { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java index dd3c606..62d1177 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java @@ -23,8 +23,10 @@ import io.r2dbc.spi.Connection; * @author Mark Paluch * @see SimpleConnectionHandle * @see ConnectionHolder + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ @FunctionalInterface +@Deprecated public interface ConnectionHandle { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHolder.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHolder.java index 284c20c..ea976f3 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHolder.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHolder.java @@ -22,8 +22,8 @@ import org.springframework.transaction.support.ResourceHolderSupport; import org.springframework.util.Assert; /** - * Resource holder wrapping a R2DBC {@link Connection}. {@link R2dbcTransactionManager} binds instances of - * this class to the thread, for a specific {@link ConnectionFactory}. + * Resource holder wrapping a R2DBC {@link Connection}. {@link R2dbcTransactionManager} binds instances of this class to + * the thread, for a specific {@link ConnectionFactory}. *

* Inherits rollback-only support for nested R2DBC transactions and reference count functionality from the base class. *

@@ -33,7 +33,9 @@ import org.springframework.util.Assert; * @author Christoph Strobl * @see R2dbcTransactionManager * @see ConnectionFactoryUtils + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class ConnectionHolder extends ResourceHolderSupport { @Nullable private ConnectionHandle connectionHandle; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionProxy.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionProxy.java index c607a88..a278326 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionProxy.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionProxy.java @@ -26,7 +26,9 @@ import io.r2dbc.spi.Wrapped; * * @author Mark Paluch * @author Christoph Strobl + * @deprecated since 1.2 in favor of Spring R2DBC. Use R2DBC's {@link Wrapped} mechanism instead. */ +@Deprecated public interface ConnectionProxy extends Connection, Wrapped { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/DelegatingConnectionFactory.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/DelegatingConnectionFactory.java index 12f7eac..903f8ee 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/DelegatingConnectionFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/DelegatingConnectionFactory.java @@ -32,7 +32,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @see #create + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class DelegatingConnectionFactory implements ConnectionFactory, Wrapped { private final ConnectionFactory targetConnectionFactory; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/R2dbcTransactionManager.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/R2dbcTransactionManager.java index e7c1d26..b6324a1 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/R2dbcTransactionManager.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/R2dbcTransactionManager.java @@ -73,7 +73,9 @@ import org.springframework.util.Assert; * @see ConnectionFactoryUtils#releaseConnection * @see TransactionAwareConnectionFactoryProxy * @see DatabaseClient + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class R2dbcTransactionManager extends AbstractReactiveTransactionManager implements InitializingBean { private ConnectionFactory connectionFactory; @@ -135,7 +137,7 @@ public class R2dbcTransactionManager extends AbstractReactiveTransactionManager *

* If no custom translator is provided, a default {@link R2dbcExceptionSubclassTranslator} is used which translates * {@link R2dbcException}'s subclasses into Springs {@link DataAccessException} hierarchy. - * + * * @see R2dbcExceptionSubclassTranslator * @since 1.1 */ @@ -526,7 +528,7 @@ public class R2dbcTransactionManager extends AbstractReactiveTransactionManager *

* The default implementation throws a {@link TransactionSystemException}. Subclasses may specifically identify * concurrency failures etc. - * + * * @param task the task description (commit or rollback). * @param ex the SQLException thrown from commit/rollback. * @return the translated exception to throw, either a {@link org.springframework.dao.DataAccessException} or a diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SimpleConnectionHandle.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SimpleConnectionHandle.java index 40c27ed..27206cf 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SimpleConnectionHandle.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SimpleConnectionHandle.java @@ -24,7 +24,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Christoph Strobl + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class SimpleConnectionHandle implements ConnectionHandle { private final Connection connection; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SingleConnectionConnectionFactory.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SingleConnectionConnectionFactory.java index 115d758..488a23a 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SingleConnectionConnectionFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SingleConnectionConnectionFactory.java @@ -53,7 +53,9 @@ import org.springframework.util.Assert; * @see #create() * @see io.r2dbc.spi.Connection#close() * @see ConnectionFactoryUtils#releaseConnection(io.r2dbc.spi.Connection, ConnectionFactory) + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class SingleConnectionConnectionFactory extends DelegatingConnectionFactory implements SmartConnectionFactory, DisposableBean { diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java index 802dd14..aa7f59b 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java @@ -27,7 +27,9 @@ import io.r2dbc.spi.ConnectionFactory; * * @author Mark Paluch * @see ConnectionFactoryUtils#closeConnection + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public interface SmartConnectionFactory extends ConnectionFactory { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/TransactionAwareConnectionFactoryProxy.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/TransactionAwareConnectionFactoryProxy.java index a3e7294..29bbad8 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/TransactionAwareConnectionFactoryProxy.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/TransactionAwareConnectionFactoryProxy.java @@ -60,7 +60,9 @@ import org.springframework.util.ReflectionUtils; * @see Connection#close * @see ConnectionFactoryUtils#doGetConnection * @see ConnectionFactoryUtils#doReleaseConnection + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. */ +@Deprecated public class TransactionAwareConnectionFactoryProxy extends DelegatingConnectionFactory { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CannotReadScriptException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CannotReadScriptException.java index 0164c87..9c7c3b8 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CannotReadScriptException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CannotReadScriptException.java @@ -21,7 +21,9 @@ import org.springframework.core.io.support.EncodedResource; * Thrown by {@link ScriptUtils} if an SQL script cannot be read. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class CannotReadScriptException extends ScriptException { private static final long serialVersionUID = 7253084944991764250L; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CompositeDatabasePopulator.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CompositeDatabasePopulator.java index 4b35bc4..75e42c4 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CompositeDatabasePopulator.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/CompositeDatabasePopulator.java @@ -31,7 +31,9 @@ import org.springframework.util.Assert; * executing all scripts. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class CompositeDatabasePopulator implements DatabasePopulator { private final List populators = new ArrayList<>(4); diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ConnectionFactoryInitializer.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ConnectionFactoryInitializer.java index dd492a9..d770bf9 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ConnectionFactoryInitializer.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ConnectionFactoryInitializer.java @@ -28,7 +28,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @see DatabasePopulator + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class ConnectionFactoryInitializer implements InitializingBean, DisposableBean { private @Nullable ConnectionFactory connectionFactory; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulator.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulator.java index 9e1cf05..d471d54 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulator.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulator.java @@ -25,8 +25,10 @@ import reactor.core.publisher.Mono; * @see ResourceDatabasePopulator * @see DatabasePopulatorUtils * @see ConnectionFactoryInitializer + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ @FunctionalInterface +@Deprecated public interface DatabasePopulator { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java index c185385..db6ad11 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java @@ -27,7 +27,9 @@ import org.springframework.util.Assert; * Utility methods for executing a {@link DatabasePopulator}. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public abstract class DatabasePopulatorUtils { // utility constructor diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ResourceDatabasePopulator.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ResourceDatabasePopulator.java index 24fa7db..3b0b4c4 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ResourceDatabasePopulator.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ResourceDatabasePopulator.java @@ -45,7 +45,9 @@ import org.springframework.util.StringUtils; * @author Mark Paluch * @see DatabasePopulatorUtils * @see ScriptUtils + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class ResourceDatabasePopulator implements DatabasePopulator { List scripts = new ArrayList<>(); diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptException.java index 068843c..9f67503 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptException.java @@ -22,7 +22,9 @@ import org.springframework.lang.Nullable; * Root of the hierarchy of data access exceptions that are related to processing of SQL scripts. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public abstract class ScriptException extends DataAccessException { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptParseException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptParseException.java index fe43adc..b3e8dcf 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptParseException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptParseException.java @@ -22,7 +22,9 @@ import org.springframework.lang.Nullable; * Thrown by {@link ScriptUtils} if an SQL script cannot be properly parsed. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class ScriptParseException extends ScriptException { private static final long serialVersionUID = 6130513243627087332L; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptStatementFailedException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptStatementFailedException.java index 0da186e..f81be86 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptStatementFailedException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptStatementFailedException.java @@ -21,7 +21,9 @@ import org.springframework.core.io.support.EncodedResource; * Thrown by {@link ScriptUtils} if a statement in an SQL script failed when executing it against the target database. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class ScriptStatementFailedException extends ScriptException { private static final long serialVersionUID = 912676424615782262L; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptUtils.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptUtils.java index 71f2c13..5cb3500 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptUtils.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/ScriptUtils.java @@ -48,7 +48,9 @@ import org.springframework.util.StringUtils; * Mainly for internal use within the framework. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public abstract class ScriptUtils { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/UncategorizedScriptException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/UncategorizedScriptException.java index 59d8941..62b840b 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/UncategorizedScriptException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/UncategorizedScriptException.java @@ -20,7 +20,9 @@ package org.springframework.data.r2dbc.connectionfactory.init; * for example, a {@link io.r2dbc.spi.R2dbcException} from R2DBC that we cannot pinpoint more precisely. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ +@Deprecated public class UncategorizedScriptException extends ScriptException { private static final long serialVersionUID = -3196706179230349902L; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/package-info.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/package-info.java index 113c6ba..d76b482 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/package-info.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/package-info.java @@ -1,5 +1,6 @@ /** - * Provides extensible support for initializing databases through scripts. + * Provides extensible support for initializing databases through scripts. Deprecated since 1.2 in favor of Spring + * R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. */ @org.springframework.lang.NonNullApi @org.springframework.lang.NonNullFields diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/AbstractRoutingConnectionFactory.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/AbstractRoutingConnectionFactory.java index d868a9f..ec9a17a 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/AbstractRoutingConnectionFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/AbstractRoutingConnectionFactory.java @@ -42,7 +42,9 @@ import org.springframework.util.Assert; * @see #setTargetConnectionFactories * @see #setDefaultTargetConnectionFactory * @see #determineCurrentLookupKey() + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ +@Deprecated public abstract class AbstractRoutingConnectionFactory implements ConnectionFactory, InitializingBean { private static final Object FALLBACK_MARKER = new Object(); diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/BeanFactoryConnectionFactoryLookup.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/BeanFactoryConnectionFactoryLookup.java index f70fc79..8ba6005 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/BeanFactoryConnectionFactoryLookup.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/BeanFactoryConnectionFactoryLookup.java @@ -30,7 +30,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @see BeanFactory + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ +@Deprecated public class BeanFactoryConnectionFactoryLookup implements ConnectionFactoryLookup, BeanFactoryAware { @Nullable private BeanFactory beanFactory; diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookup.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookup.java index 2d66c82..fdc8179 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookup.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookup.java @@ -21,8 +21,10 @@ import io.r2dbc.spi.ConnectionFactory; * Strategy interface for looking up {@link ConnectionFactory} by name. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ @FunctionalInterface +@Deprecated public interface ConnectionFactoryLookup { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookupFailureException.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookupFailureException.java index 3783dfa..c70a834 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookupFailureException.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/ConnectionFactoryLookupFailureException.java @@ -22,8 +22,10 @@ import org.springframework.dao.NonTransientDataAccessException; * {@link io.r2dbc.spi.ConnectionFactory} could not be obtained. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ @SuppressWarnings("serial") +@Deprecated public class ConnectionFactoryLookupFailureException extends NonTransientDataAccessException { /** diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/MapConnectionFactoryLookup.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/MapConnectionFactoryLookup.java index 12ddea3..99e059f 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/MapConnectionFactoryLookup.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/MapConnectionFactoryLookup.java @@ -31,7 +31,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Jens Schauder + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ +@Deprecated public class MapConnectionFactoryLookup implements ConnectionFactoryLookup { private final Map connectionFactories = new HashMap<>(); diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/SingleConnectionFactoryLookup.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/SingleConnectionFactoryLookup.java index 28d6d12..521a215 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/SingleConnectionFactoryLookup.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/SingleConnectionFactoryLookup.java @@ -24,7 +24,9 @@ import org.springframework.util.Assert; * returned for any connection factory name. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.lookup} instead. */ +@Deprecated public class SingleConnectionFactoryLookup implements ConnectionFactoryLookup { private final ConnectionFactory connectionFactory; @@ -41,7 +43,7 @@ public class SingleConnectionFactoryLookup implements ConnectionFactoryLookup { this.connectionFactory = connectionFactory; } - /* + /* * (non-Javadoc) * @see org.springframework.data.r2dbc.connectionfactory.lookup.ConnectionFactoryLookup#getConnectionFactory(java.lang.String) */ diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/package-info.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/package-info.java index efb4e61..e3b1027 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/package-info.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/lookup/package-info.java @@ -1,5 +1,6 @@ /** - * Provides a strategy for looking up R2DBC ConnectionFactories by name. + * Provides a strategy for looking up R2DBC ConnectionFactories by name. Deprecated since 1.2 in favor of Spring R2DBC. + * Use {@link org.springframework.r2dbc.connection.lookup} instead. */ @org.springframework.lang.NonNullApi @org.springframework.lang.NonNullFields diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/package-info.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/package-info.java index 6e09329..b55ff51 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/package-info.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/package-info.java @@ -1,5 +1,6 @@ /** - * Connection and ConnectionFactory specifics for R2DBC. + * Connection and ConnectionFactory specifics for R2DBC. Deprecated since 1.2 in favor of Spring R2DBC. Use + * {@link org.springframework.r2dbc.connection} instead. */ @org.springframework.lang.NonNullApi @org.springframework.lang.NonNullFields diff --git a/src/main/java/org/springframework/data/r2dbc/convert/ColumnMapRowMapper.java b/src/main/java/org/springframework/data/r2dbc/convert/ColumnMapRowMapper.java index f719aae..7fff70f 100644 --- a/src/main/java/org/springframework/data/r2dbc/convert/ColumnMapRowMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/convert/ColumnMapRowMapper.java @@ -19,7 +19,6 @@ import io.r2dbc.spi.ColumnMetadata; import io.r2dbc.spi.Row; import io.r2dbc.spi.RowMetadata; -import java.util.Collection; import java.util.Map; import java.util.function.BiFunction; @@ -40,26 +39,15 @@ import org.springframework.util.LinkedCaseInsensitiveMap; * names in the same casing as exposed by the driver. * * @author Mark Paluch + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.core.ColumnMapRowMapper} directly. */ -public class ColumnMapRowMapper implements BiFunction> { +public class ColumnMapRowMapper extends org.springframework.r2dbc.core.ColumnMapRowMapper { public final static ColumnMapRowMapper INSTANCE = new ColumnMapRowMapper(); @Override public Map apply(Row row, RowMetadata rowMetadata) { - - Collection columns = IterableUtils.toCollection(rowMetadata.getColumnMetadatas()); - int columnCount = columns.size(); - Map mapOfColValues = createColumnMap(columnCount); - - int index = 0; - for (ColumnMetadata column : columns) { - - String key = getColumnKey(column.getName()); - Object obj = getColumnValue(row, index++); - mapOfColValues.put(key, obj); - } - return mapOfColValues; + return super.apply(row, rowMetadata); } /** @@ -72,7 +60,7 @@ public class ColumnMapRowMapper implements BiFunction createColumnMap(int columnCount) { - return new LinkedCaseInsensitiveMap<>(columnCount); + return super.createColumnMap(columnCount); } /** @@ -83,7 +71,7 @@ public class ColumnMapRowMapper implements BiFunction Collection toCollection(Iterable iterable) { - - Assert.notNull(iterable, "Iterable must not be null!"); - - if (iterable instanceof Collection) { - return (Collection) iterable; - } - - List result = new ArrayList<>(); - - for (T element : iterable) { - result.add(element); - } - - return result; - } - - static List toList(Iterable iterable) { - - Assert.notNull(iterable, "Iterable must not be null!"); - - if (iterable instanceof List) { - return (List) iterable; - } - - List result = new ArrayList<>(); - - for (T element : iterable) { - result.add(element); - } - - return result; - } -} diff --git a/src/main/java/org/springframework/data/r2dbc/core/BindParameterSource.java b/src/main/java/org/springframework/data/r2dbc/core/BindParameterSource.java index 5403c8d..c4dfd26 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/BindParameterSource.java +++ b/src/main/java/org/springframework/data/r2dbc/core/BindParameterSource.java @@ -29,7 +29,9 @@ import org.springframework.lang.Nullable; * * @author Mark Paluch * @see MapBindParameterSource + * @deprecated since 1.2, without replacement. */ +@Deprecated public interface BindParameterSource { /** diff --git a/src/main/java/org/springframework/data/r2dbc/core/ConnectionAccessor.java b/src/main/java/org/springframework/data/r2dbc/core/ConnectionAccessor.java index 219670e..fc7b77b 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/ConnectionAccessor.java +++ b/src/main/java/org/springframework/data/r2dbc/core/ConnectionAccessor.java @@ -32,8 +32,9 @@ import org.springframework.dao.DataAccessException; * long the allocated {@link Connection} is valid. Connections are released after the publisher terminates. * * @author Mark Paluch + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.core.DatabaseClient} support instead. */ -public interface ConnectionAccessor { +public interface ConnectionAccessor extends org.springframework.r2dbc.core.ConnectionAccessor { /** * Execute a callback {@link Function} within a {@link Connection} scope. The function is responsible for creating a diff --git a/src/main/java/org/springframework/data/r2dbc/core/DatabaseClient.java b/src/main/java/org/springframework/data/r2dbc/core/DatabaseClient.java index 593e6c6..e1f0ae5 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DatabaseClient.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DatabaseClient.java @@ -49,7 +49,9 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Bogdan Ilchyshyn + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.core.DatabaseClient} support instead. */ +@Deprecated public interface DatabaseClient { /** diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java index 194d994..5690ba6 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java @@ -44,6 +44,7 @@ import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.reactivestreams.Publisher; + import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.domain.Pageable; @@ -62,6 +63,7 @@ import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.CriteriaDefinition; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.PreparedOperation; import org.springframework.util.Assert; import org.springframework.util.StringUtils; diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java index 75186ad..25a5e14 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java @@ -46,6 +46,7 @@ import org.springframework.data.relational.core.mapping.RelationalPersistentEnti import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.Parameter; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -280,6 +281,15 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra return this.updateMapper.getBindValue(value); } + /* + * (non-Javadoc) + * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#getBindValue(Parameter) + */ + @Override + public Parameter getBindValue(Parameter value) { + return this.updateMapper.getBindValue(value); + } + /* * (non-Javadoc) * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#getRowMapper(java.lang.Class) diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultSqlResult.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultSqlResult.java index 986842c..fabcd0f 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultSqlResult.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultSqlResult.java @@ -31,13 +31,9 @@ import java.util.function.Function; * * @author Mark Paluch */ -class DefaultSqlResult implements SqlResult { +class DefaultSqlResult implements FetchSpec { - private final static SqlResult EMPTY = new SqlResult() { - @Override - public SqlResult map(BiFunction mappingFunction) { - return DefaultSqlResult.empty(); - } + private final static FetchSpec EMPTY = new FetchSpec() { @Override public Mono one() { @@ -104,15 +100,14 @@ class DefaultSqlResult implements SqlResult { * @return a {@code SqlResult}. */ @SuppressWarnings("unchecked") - public static SqlResult empty() { - return (SqlResult) EMPTY; + public static FetchSpec empty() { + return (FetchSpec) EMPTY; } /* (non-Javadoc) * @see org.springframework.data.r2dbc.function.SqlResult#map(java.util.function.BiFunction) */ - @Override - public SqlResult map(BiFunction mappingFunction) { + public FetchSpec map(BiFunction mappingFunction) { return new DefaultSqlResult<>(connectionAccessor, sql, resultFunction, updatedRowsFunction, mappingFunction); } diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java index fe481ed..7c084fc 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java @@ -19,9 +19,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.r2dbc.dialect.BindMarkers; import org.springframework.data.r2dbc.dialect.BindTarget; -import org.springframework.data.r2dbc.dialect.Bindings; import org.springframework.data.r2dbc.dialect.R2dbcDialect; import org.springframework.data.r2dbc.query.BoundAssignments; import org.springframework.data.r2dbc.query.BoundCondition; @@ -34,6 +32,8 @@ import org.springframework.data.relational.core.sql.InsertBuilder.InsertValuesWi import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.data.relational.core.sql.render.SqlRenderer; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.Bindings; import org.springframework.util.Assert; /** @@ -336,6 +336,11 @@ class DefaultStatementMapper implements StatementMapper { public void bindTo(BindTarget to) { this.bindings.apply(to); } + + @Override + public void bindTo(org.springframework.r2dbc.core.binding.BindTarget to) { + this.bindings.apply(to); + } } class DefaultTypedStatementMapper implements TypedStatementMapper { diff --git a/src/main/java/org/springframework/data/r2dbc/core/ExecuteFunction.java b/src/main/java/org/springframework/data/r2dbc/core/ExecuteFunction.java index 773916d..a0447b2 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/ExecuteFunction.java +++ b/src/main/java/org/springframework/data/r2dbc/core/ExecuteFunction.java @@ -32,9 +32,11 @@ import org.reactivestreams.Publisher; * @author Mark Paluch * @since 1.1 * @see Statement#execute() + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ +@Deprecated @FunctionalInterface -public interface ExecuteFunction { +public interface ExecuteFunction extends org.springframework.r2dbc.core.ExecuteFunction { /** * Execute the given {@link Statement} for a stream of {@link Result}s. diff --git a/src/main/java/org/springframework/data/r2dbc/core/FetchSpec.java b/src/main/java/org/springframework/data/r2dbc/core/FetchSpec.java index b4ea110..133bc79 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/FetchSpec.java +++ b/src/main/java/org/springframework/data/r2dbc/core/FetchSpec.java @@ -22,5 +22,7 @@ package org.springframework.data.r2dbc.core; * @author Mark Paluch * @see RowsFetchSpec * @see UpdatedRowsFetchSpec + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ +@Deprecated public interface FetchSpec extends RowsFetchSpec, UpdatedRowsFetchSpec {} diff --git a/src/main/java/org/springframework/data/r2dbc/core/MapBindParameterSource.java b/src/main/java/org/springframework/data/r2dbc/core/MapBindParameterSource.java index 6b1e841..fc36dbb 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/MapBindParameterSource.java +++ b/src/main/java/org/springframework/data/r2dbc/core/MapBindParameterSource.java @@ -31,6 +31,7 @@ import org.springframework.util.Assert; * * @author Mark Paluch */ +@Deprecated class MapBindParameterSource implements BindParameterSource { private final Map values; diff --git a/src/main/java/org/springframework/data/r2dbc/core/NamedParameterExpander.java b/src/main/java/org/springframework/data/r2dbc/core/NamedParameterExpander.java index 2137fb2..5093c47 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/NamedParameterExpander.java +++ b/src/main/java/org/springframework/data/r2dbc/core/NamedParameterExpander.java @@ -36,7 +36,9 @@ import org.springframework.data.r2dbc.dialect.BindMarkersFactory; * NOTE: An instance of this class is thread-safe once configured. * * @author Mark Paluch + * @deprecated since 1.2, without replacement. */ +@Deprecated public class NamedParameterExpander { /** @@ -124,6 +126,11 @@ public class NamedParameterExpander { */ public PreparedOperation expand(String sql, BindMarkersFactory bindMarkersFactory, BindParameterSource paramSource) { + return expand(sql, (org.springframework.r2dbc.core.binding.BindMarkersFactory) bindMarkersFactory, paramSource); + } + + PreparedOperation expand(String sql, + org.springframework.r2dbc.core.binding.BindMarkersFactory bindMarkersFactory, BindParameterSource paramSource) { ParsedSql parsedSql = getParsedSql(sql); diff --git a/src/main/java/org/springframework/data/r2dbc/core/NamedParameterUtils.java b/src/main/java/org/springframework/data/r2dbc/core/NamedParameterUtils.java index 301aecc..083e2ef 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/NamedParameterUtils.java +++ b/src/main/java/org/springframework/data/r2dbc/core/NamedParameterUtils.java @@ -26,10 +26,10 @@ import java.util.Set; import java.util.TreeMap; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.r2dbc.dialect.BindMarker; -import org.springframework.data.r2dbc.dialect.BindMarkers; -import org.springframework.data.r2dbc.dialect.BindMarkersFactory; import org.springframework.data.r2dbc.dialect.BindTarget; +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; import org.springframework.util.Assert; /** @@ -47,6 +47,7 @@ import org.springframework.util.Assert; * @author Juergen Hoeller * @author Mark Paluch */ +@Deprecated abstract class NamedParameterUtils { /** @@ -494,7 +495,7 @@ abstract class NamedParameterUtils { } @SuppressWarnings("unchecked") - public void bind(BindTarget target, String identifier, Object value) { + public void bind(org.springframework.r2dbc.core.binding.BindTarget target, String identifier, Object value) { List bindMarkers = getBindMarkers(identifier); @@ -530,7 +531,8 @@ abstract class NamedParameterUtils { } } - private void bind(BindTarget target, Iterator markers, Object valueToBind) { + private void bind(org.springframework.r2dbc.core.binding.BindTarget target, Iterator markers, + Object valueToBind) { Assert.isTrue(markers.hasNext(), () -> String.format( @@ -540,7 +542,8 @@ abstract class NamedParameterUtils { markers.next().bind(target, valueToBind); } - public void bindNull(BindTarget target, String identifier, Class valueType) { + public void bindNull(org.springframework.r2dbc.core.binding.BindTarget target, String identifier, + Class valueType) { List bindMarkers = getBindMarkers(identifier); @@ -579,6 +582,11 @@ abstract class NamedParameterUtils { @Override public void bindTo(BindTarget target) { + bindTo((org.springframework.r2dbc.core.binding.BindTarget) target); + } + + @Override + public void bindTo(org.springframework.r2dbc.core.binding.BindTarget target) { for (String namedParameter : this.parameterSource.getParameterNames()) { diff --git a/src/main/java/org/springframework/data/r2dbc/core/ParsedSql.java b/src/main/java/org/springframework/data/r2dbc/core/ParsedSql.java index efa5bb8..af3cc6e 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/ParsedSql.java +++ b/src/main/java/org/springframework/data/r2dbc/core/ParsedSql.java @@ -26,6 +26,7 @@ import java.util.List; * @author Thomas Risberg * @author Juergen Hoeller */ +@Deprecated class ParsedSql { private String originalSql; diff --git a/src/main/java/org/springframework/data/r2dbc/core/PreparedOperation.java b/src/main/java/org/springframework/data/r2dbc/core/PreparedOperation.java index 7394551..fede137 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/PreparedOperation.java +++ b/src/main/java/org/springframework/data/r2dbc/core/PreparedOperation.java @@ -29,8 +29,10 @@ import org.springframework.data.r2dbc.dialect.BindTarget; * @param underlying operation source. * @author Mark Paluch * @see org.springframework.data.r2dbc.core.DatabaseClient#execute(Supplier) + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.core} support instead. */ -public interface PreparedOperation extends QueryOperation { +@Deprecated +public interface PreparedOperation extends QueryOperation, org.springframework.r2dbc.core.PreparedOperation { /** * @return the query source, such as a statement/criteria object. @@ -44,4 +46,9 @@ public interface PreparedOperation extends QueryOperation { */ void bindTo(BindTarget target); + @Override + default String get() { + return toQuery(); + } + } diff --git a/src/main/java/org/springframework/data/r2dbc/core/QueryOperation.java b/src/main/java/org/springframework/data/r2dbc/core/QueryOperation.java index b531339..c7f08a3 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/QueryOperation.java +++ b/src/main/java/org/springframework/data/r2dbc/core/QueryOperation.java @@ -23,9 +23,11 @@ import java.util.function.Supplier; * * @author Mark Paluch * @see PreparedOperation + * @deprecated since 1.2, use Spring R2DBC's {@link org.springframework.r2dbc.core} support instead. */ @FunctionalInterface -public interface QueryOperation extends Supplier { +@Deprecated +public interface QueryOperation extends Supplier, org.springframework.r2dbc.core.QueryOperation { /** * Returns the string-representation of this operation to be used with {@link io.r2dbc.spi.Statement} creation. diff --git a/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java b/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java index ce0663c..a5dd2f8 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java +++ b/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java @@ -64,6 +64,7 @@ import org.springframework.data.relational.core.sql.Functions; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.data.relational.core.sql.Table; import org.springframework.data.util.ProxyUtils; +import org.springframework.r2dbc.core.PreparedOperation; import org.springframework.lang.Nullable; import org.springframework.util.Assert; diff --git a/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java index 8c65fa5..f96a95a 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java @@ -27,6 +27,8 @@ import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.relational.core.sql.IdentifierProcessing; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.Parameter; +import org.springframework.r2dbc.core.PreparedOperation; /** * Data access strategy that generalizes convenience operations using mapped entities. Typically used internally by @@ -34,7 +36,7 @@ import org.springframework.lang.Nullable; * primary keys. * * @author Mark Paluch - * @see PreparedOperation + * @see org.springframework.r2dbc.core.PreparedOperation */ public interface ReactiveDataAccessStrategy { @@ -64,9 +66,19 @@ public interface ReactiveDataAccessStrategy { * @param value must not be {@literal null}. * @return * @since 1.1 + * @deprecated since 1.2, use {@link #getBindValue(Parameter)} instead. */ SettableValue getBindValue(SettableValue value); + /** + * Return a potentially converted {@link SettableValue} for strategies that support type conversion. + * + * @param value must not be {@literal null}. + * @return + * @since 1.2 + */ + Parameter getBindValue(Parameter value); + /** * Returns a {@link BiFunction row mapping function} to map {@link Row rows} to {@code T}. * diff --git a/src/main/java/org/springframework/data/r2dbc/core/RowsFetchSpec.java b/src/main/java/org/springframework/data/r2dbc/core/RowsFetchSpec.java index e6f59a7..3b76d4d 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/RowsFetchSpec.java +++ b/src/main/java/org/springframework/data/r2dbc/core/RowsFetchSpec.java @@ -23,7 +23,9 @@ import reactor.core.publisher.Mono; * * @param row result type. * @author Mark Paluch + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ +@Deprecated public interface RowsFetchSpec { /** diff --git a/src/main/java/org/springframework/data/r2dbc/core/SqlProvider.java b/src/main/java/org/springframework/data/r2dbc/core/SqlProvider.java index 7b02b60..914e340 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/SqlProvider.java +++ b/src/main/java/org/springframework/data/r2dbc/core/SqlProvider.java @@ -25,8 +25,10 @@ import org.springframework.lang.Nullable; * * @author Juergen Hoeller * @author Mark Paluch + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ -public interface SqlProvider { +@Deprecated +public interface SqlProvider extends org.springframework.r2dbc.core.SqlProvider { /** * Return the SQL string for this object, i.e. typically the SQL used for creating statements. diff --git a/src/main/java/org/springframework/data/r2dbc/core/SqlResult.java b/src/main/java/org/springframework/data/r2dbc/core/SqlResult.java deleted file mode 100644 index 8cf624d..0000000 --- a/src/main/java/org/springframework/data/r2dbc/core/SqlResult.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2018-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.r2dbc.core; - -import io.r2dbc.spi.Row; -import io.r2dbc.spi.RowMetadata; - -import java.util.function.BiFunction; - -/** - * Mappable {@link FetchSpec} that accepts a {@link BiFunction mapping function} to map SQL {@link Row}s. - * - * @author Mark Paluch - */ -interface SqlResult extends FetchSpec { - - /** - * Apply a {@link BiFunction mapping function} to the result that emits {@link Row}s. - * - * @param mappingFunction must not be {@literal null}. - * @param the value type of the {@code SqlResult}. - * @return a new {@link SqlResult} with {@link BiFunction mapping function} applied. - */ - SqlResult map(BiFunction mappingFunction); -} diff --git a/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunction.java b/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunction.java index 520b7ab..a7350f6 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunction.java +++ b/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunction.java @@ -31,7 +31,9 @@ import org.springframework.util.Assert; * @author Mark Paluch * @since 1.1 * @see ExecuteFunction + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ +@Deprecated @FunctionalInterface public interface StatementFilterFunction { diff --git a/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunctions.java b/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunctions.java index e978899..f98c8b3 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunctions.java +++ b/src/main/java/org/springframework/data/r2dbc/core/StatementFilterFunctions.java @@ -26,6 +26,7 @@ import org.reactivestreams.Publisher; * @author Mark Paluch * @since 1.1 */ +@Deprecated enum StatementFilterFunctions implements StatementFilterFunction { EMPTY_FILTER; diff --git a/src/main/java/org/springframework/data/r2dbc/core/StatementMapper.java b/src/main/java/org/springframework/data/r2dbc/core/StatementMapper.java index 22399e7..b21e687 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/StatementMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/core/StatementMapper.java @@ -36,6 +36,7 @@ import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.data.relational.core.sql.Table; import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.PreparedOperation; /** * Mapper for statement specifications to {@link PreparedOperation}. Statement mapping applies a diff --git a/src/main/java/org/springframework/data/r2dbc/core/UpdatedRowsFetchSpec.java b/src/main/java/org/springframework/data/r2dbc/core/UpdatedRowsFetchSpec.java index 256d259..69aee60 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/UpdatedRowsFetchSpec.java +++ b/src/main/java/org/springframework/data/r2dbc/core/UpdatedRowsFetchSpec.java @@ -21,7 +21,9 @@ import reactor.core.publisher.Mono; * Contract for fetching the number of affected rows. * * @author Mark Paluch + * @deprecated since 1.2, use Spring's {@link org.springframework.r2dbc.core} support instead. */ +@Deprecated public interface UpdatedRowsFetchSpec { /** diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java deleted file mode 100644 index 205e1a4..0000000 --- a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2019-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.r2dbc.dialect; - -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; - -/** - * Anonymous, index-based bind marker using a static placeholder. Instances are bound by the ordinal position ordered by - * the appearance of the placeholder. This implementation creates indexed bind markers using an anonymous placeholder - * that correlates with an index. - *

- * Note: Anonymous bind markers are problematic because the have to appear in generated SQL in the same order they get generated. - * - * This might cause challenges in the future with complex generate statements. - * For example those containing subselects which limit the freedom of arranging bind markers. - *

- * - * @author Mark Paluch - */ -class AnonymousBindMarkers implements BindMarkers { - - private static final AtomicIntegerFieldUpdater COUNTER_INCREMENTER = AtomicIntegerFieldUpdater - .newUpdater(AnonymousBindMarkers.class, "counter"); - - // access via COUNTER_INCREMENTER - @SuppressWarnings("unused") private volatile int counter; - - private final String placeholder; - - /** - * Creates a new {@link AnonymousBindMarkers} instance given {@code placeholder}. - * - * @param placeholder parameter bind marker. - */ - AnonymousBindMarkers(String placeholder) { - this.counter = 0; - this.placeholder = placeholder; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarkers#next() - */ - @Override - public BindMarker next() { - - int index = COUNTER_INCREMENTER.getAndIncrement(this); - - return new IndexedBindMarker(placeholder, index); - } - -} diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarker.java b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarker.java index 6624052..e574aae 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarker.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarker.java @@ -10,8 +10,10 @@ import io.r2dbc.spi.Statement; * @see Statement#bind * @see BindMarkers * @see BindMarkersFactory + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ -public interface BindMarker { +@Deprecated +public interface BindMarker extends org.springframework.r2dbc.core.binding.BindMarker { /** * Returns the database-specific placeholder for a given substitution. diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkers.java index 3d56ed4..53296d3 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkers.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkers.java @@ -12,9 +12,11 @@ package org.springframework.data.r2dbc.dialect; * @see BindMarker * @see BindMarkersFactory * @see io.r2dbc.spi.Statement#bind + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ @FunctionalInterface -public interface BindMarkers { +@Deprecated +public interface BindMarkers extends org.springframework.r2dbc.core.binding.BindMarkers { /** * Creates a new {@link BindMarker}. diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersAdapter.java b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersAdapter.java new file mode 100644 index 0000000..448ea22 --- /dev/null +++ b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersAdapter.java @@ -0,0 +1,85 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.r2dbc.dialect; + +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.BindTarget; + +/** + * Adapter to use Spring R2DBC's {@link org.springframework.r2dbc.core.binding.BindMarkers} exposing it as + * {@link org.springframework.data.r2dbc.dialect.BindMarkers}. + * + * @author Mark Paluch + * @since 1.2 + */ +class BindMarkersAdapter implements org.springframework.data.r2dbc.dialect.BindMarkers { + + private final BindMarkers delegate; + + BindMarkersAdapter(BindMarkers delegate) { + this.delegate = delegate; + } + + @Override + public org.springframework.data.r2dbc.dialect.BindMarker next() { + return new BindMarkerAdapter(delegate.next()); + } + + @Override + public org.springframework.data.r2dbc.dialect.BindMarker next(String hint) { + return new BindMarkerAdapter(delegate.next()); + } + + static class BindMarkerAdapter implements org.springframework.data.r2dbc.dialect.BindMarker { + + private final BindMarker delegate; + + BindMarkerAdapter(BindMarker delegate) { + this.delegate = delegate; + } + + @Override + public String getPlaceholder() { + return delegate.getPlaceholder(); + } + + @Override + public void bind(org.springframework.data.r2dbc.dialect.BindTarget bindTarget, Object value) { + delegate.bind(bindTarget, value); + } + + @Override + public void bindNull(org.springframework.data.r2dbc.dialect.BindTarget bindTarget, Class valueType) { + delegate.bindNull(bindTarget, valueType); + } + + @Override + public void bind(BindTarget bindTarget, Object value) { + delegate.bind(bindTarget, value); + } + + @Override + public void bindNull(BindTarget bindTarget, Class valueType) { + delegate.bindNull(bindTarget, valueType); + } + + @Override + public String toString() { + return delegate.toString(); + } + } +} diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersFactory.java b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersFactory.java index 15755cc..55f3aee 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/BindMarkersFactory.java @@ -15,9 +15,11 @@ import org.springframework.util.Assert; * @author Mark Paluch * @see BindMarkers * @see io.r2dbc.spi.Statement + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ @FunctionalInterface -public interface BindMarkersFactory { +@Deprecated +public interface BindMarkersFactory extends org.springframework.r2dbc.core.binding.BindMarkersFactory { /** * Create a new {@link BindMarkers} instance. @@ -52,7 +54,21 @@ public interface BindMarkersFactory { Assert.notNull(prefix, "Prefix must not be null!"); - return () -> new IndexedBindMarkers(prefix, beginWith); + org.springframework.r2dbc.core.binding.BindMarkersFactory factory = org.springframework.r2dbc.core.binding.BindMarkersFactory + .indexed(prefix, beginWith); + + return new BindMarkersFactory() { + + @Override + public BindMarkers create() { + return new BindMarkersAdapter(factory.create()); + } + + @Override + public boolean identifiablePlaceholders() { + return factory.identifiablePlaceholders(); + } + }; } /** @@ -68,17 +84,19 @@ public interface BindMarkersFactory { static BindMarkersFactory anonymous(String placeholder) { Assert.hasText(placeholder, "Placeholder must not be empty!"); + org.springframework.r2dbc.core.binding.BindMarkersFactory factory = org.springframework.r2dbc.core.binding.BindMarkersFactory + .anonymous(placeholder); return new BindMarkersFactory() { @Override public BindMarkers create() { - return new AnonymousBindMarkers(placeholder); + return new BindMarkersAdapter(factory.create()); } @Override public boolean identifiablePlaceholders() { - return false; + return factory.identifiablePlaceholders(); } }; } @@ -127,6 +145,20 @@ public interface BindMarkersFactory { Assert.notNull(namePrefix, "Index prefix must not be null!"); Assert.notNull(hintFilterFunction, "Hint filter function must not be null!"); - return () -> new NamedBindMarkers(prefix, namePrefix, maxLength, hintFilterFunction); + org.springframework.r2dbc.core.binding.BindMarkersFactory factory = org.springframework.r2dbc.core.binding.BindMarkersFactory + .named(prefix, namePrefix, maxLength, hintFilterFunction); + + return new BindMarkersFactory() { + + @Override + public BindMarkers create() { + return new BindMarkersAdapter(factory.create()); + } + + @Override + public boolean identifiablePlaceholders() { + return factory.identifiablePlaceholders(); + } + }; } } diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/BindTarget.java b/src/main/java/org/springframework/data/r2dbc/dialect/BindTarget.java index a1098bd..d7b9558 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/BindTarget.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/BindTarget.java @@ -24,8 +24,10 @@ import org.springframework.data.r2dbc.core.PreparedOperation; * @see PreparedOperation * @see io.r2dbc.spi.Statement#bind * @see io.r2dbc.spi.Statement#bindNull + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ -public interface BindTarget { +@Deprecated +public interface BindTarget extends org.springframework.r2dbc.core.binding.BindTarget { /** * Bind a value. diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/Bindings.java b/src/main/java/org/springframework/data/r2dbc/dialect/Bindings.java index e0e503c..2e1bcb4 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/Bindings.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/Bindings.java @@ -29,6 +29,9 @@ import java.util.function.Consumer; import org.springframework.data.util.Streamable; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.BindTarget; import org.springframework.util.Assert; /** @@ -36,7 +39,9 @@ import org.springframework.util.Assert; * Bindings are typically immutable. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ +@Deprecated public class Bindings implements Streamable { private static final Bindings EMPTY = new Bindings(); diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarker.java b/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarker.java deleted file mode 100644 index 613f4e1..0000000 --- a/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarker.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2019-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.r2dbc.dialect; - -/** - * A single indexed bind marker. - */ -class IndexedBindMarker implements BindMarker { - - private final String placeholder; - - private final int index; - - IndexedBindMarker(String placeholder, int index) { - this.placeholder = placeholder; - this.index = index; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#getPlaceholder() - */ - @Override - public String getPlaceholder() { - return placeholder; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#bindValue(org.springframework.data.r2dbc.dialect.BindTarget, java.lang.Object) - */ - @Override - public void bind(BindTarget target, Object value) { - target.bind(this.index, value); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#bindNull(org.springframework.data.r2dbc.dialect.BindTarget, java.lang.Class) - */ - @Override - public void bindNull(BindTarget target, Class valueType) { - target.bindNull(this.index, valueType); - } - - - public int getIndex() { - return index; - } - -} diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkers.java deleted file mode 100644 index 50a80c0..0000000 --- a/src/main/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkers.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.springframework.data.r2dbc.dialect; - -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; - -/** - * Index-based bind marker. This implementation creates indexed bind markers using a numeric index and an optional - * prefix for bind markers to be represented within the query string. - * - * @author Mark Paluch - * @author Jens Schauder - */ -class IndexedBindMarkers implements BindMarkers { - - private static final AtomicIntegerFieldUpdater COUNTER_INCREMENTER = AtomicIntegerFieldUpdater - .newUpdater(org.springframework.data.r2dbc.dialect.IndexedBindMarkers.class, "counter"); - - // access via COUNTER_INCREMENTER - @SuppressWarnings("unused") private volatile int counter; - - private final int offset; - private final String prefix; - - /** - * Creates a new {@link IndexedBindMarker} instance given {@code prefix} and {@code beginWith}. - * - * @param prefix bind parameter prefix. - * @param beginWith the first index to use. - */ - IndexedBindMarkers(String prefix, int beginWith) { - this.counter = 0; - this.prefix = prefix; - this.offset = beginWith; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarkers#next() - */ - @Override - public BindMarker next() { - - int index = COUNTER_INCREMENTER.getAndIncrement(this); - - return new IndexedBindMarker(prefix + "" + (index + offset), index); - } -} diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/MutableBindings.java b/src/main/java/org/springframework/data/r2dbc/dialect/MutableBindings.java index 27aad5b..0178c9e 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/MutableBindings.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/MutableBindings.java @@ -26,7 +26,9 @@ import org.springframework.util.Assert; * {@link BindMarkers}. * * @author Mark Paluch + * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.core.binding} instead. */ +@Deprecated public class MutableBindings extends Bindings { private final BindMarkers markers; diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java index ab977a8..3a38df9 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java @@ -27,6 +27,7 @@ import java.util.Set; import java.util.UUID; import org.springframework.core.convert.converter.Converter; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; /** * An SQL dialect for MySQL. diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/NamedBindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/NamedBindMarkers.java deleted file mode 100644 index 7f1dd0f..0000000 --- a/src/main/java/org/springframework/data/r2dbc/dialect/NamedBindMarkers.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.springframework.data.r2dbc.dialect; - -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.function.Function; - -import org.springframework.util.Assert; - -/** - * Name-based bind markers. - * - * @author Mark Paluch - */ -class NamedBindMarkers implements BindMarkers { - - private static final AtomicIntegerFieldUpdater COUNTER_INCREMENTER = AtomicIntegerFieldUpdater - .newUpdater(NamedBindMarkers.class, "counter"); - - // access via COUNTER_INCREMENTER - @SuppressWarnings("unused") private volatile int counter; - - private final String prefix; - - private final String namePrefix; - - private final int nameLimit; - - private final Function hintFilterFunction; - - NamedBindMarkers(String prefix, String namePrefix, int nameLimit, Function hintFilterFunction) { - - this.prefix = prefix; - this.namePrefix = namePrefix; - this.nameLimit = nameLimit; - this.hintFilterFunction = hintFilterFunction; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarkers#next() - */ - @Override - public BindMarker next() { - - String name = nextName(); - - return new NamedBindMarker(prefix + name, name); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarkers#next(java.lang.String) - */ - @Override - public BindMarker next(String hint) { - - Assert.notNull(hint, "Name hint must not be null"); - - String name = nextName() + hintFilterFunction.apply(hint); - - if (name.length() > nameLimit) { - name = name.substring(0, nameLimit); - } - - return new NamedBindMarker(prefix + name, name); - } - - private String nextName() { - - int index = COUNTER_INCREMENTER.getAndIncrement(this); - return namePrefix + index; - } - - /** - * A single named bind marker. - */ - static class NamedBindMarker implements BindMarker { - - private final String placeholder; - - private final String identifier; - - NamedBindMarker(String placeholder, String identifier) { - - this.placeholder = placeholder; - this.identifier = identifier; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#getPlaceholder() - */ - @Override - public String getPlaceholder() { - return this.placeholder; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#bindValue(org.springframework.data.r2dbc.dialect.BindTarget, java.lang.Object) - */ - @Override - public void bind(BindTarget target, Object value) { - target.bind(this.identifier, value); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.r2dbc.dialect.BindMarker#bindNull(org.springframework.data.r2dbc.dialect.BindTarget, java.lang.Class) - */ - @Override - public void bindNull(BindTarget target, Class valueType) { - target.bindNull(this.identifier, valueType); - } - } -} diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/PostgresDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/PostgresDialect.java index b26d631..77f838e 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/PostgresDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/PostgresDialect.java @@ -12,6 +12,7 @@ import java.util.UUID; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.relational.core.dialect.ArrayColumns; import org.springframework.data.util.Lazy; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; import org.springframework.util.ClassUtils; /** diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java index 9a28b6c..fe56872 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java @@ -8,6 +8,7 @@ import java.util.Set; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.r2dbc.mapping.R2dbcSimpleTypeHolder; import org.springframework.data.relational.core.dialect.Dialect; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; /** * R2DBC-specific extension to {@link Dialect}. Represents a dialect that is implemented by a particular database. diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/SqlServerDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/SqlServerDialect.java index 33ea66c..2c0fb06 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/SqlServerDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/SqlServerDialect.java @@ -6,6 +6,8 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; + /** * An SQL dialect for Microsoft SQL Server. * diff --git a/src/main/java/org/springframework/data/r2dbc/mapping/SettableValue.java b/src/main/java/org/springframework/data/r2dbc/mapping/SettableValue.java index f6db5b8..e15cd22 100644 --- a/src/main/java/org/springframework/data/r2dbc/mapping/SettableValue.java +++ b/src/main/java/org/springframework/data/r2dbc/mapping/SettableValue.java @@ -15,30 +15,24 @@ */ package org.springframework.data.r2dbc.mapping; -import java.util.Objects; - import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.Parameter; import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; -import org.springframework.util.ObjectUtils; /** * A database value that can be set in a statement. * * @author Mark Paluch * @see OutboundRow + * @deprecated since 1.2, use Spring R2DBC's {@link Parameter} directly. */ +@Deprecated public class SettableValue { - private final @Nullable Object value; - private final Class type; + private final Parameter parameter; - private SettableValue(@Nullable Object value, Class type) { - - Assert.notNull(type, "Type must not be null"); - - this.value = value; - this.type = type; + private SettableValue(Parameter parameter) { + this.parameter = parameter; } /** @@ -51,7 +45,7 @@ public class SettableValue { Assert.notNull(value, "Value must not be null"); - return new SettableValue(value, ClassUtils.getUserClass(value)); + return new SettableValue(Parameter.from(value)); } /** @@ -62,7 +56,7 @@ public class SettableValue { * @return the {@link SettableValue} value for {@code value}. */ public static SettableValue fromOrEmpty(@Nullable Object value, Class type) { - return value == null ? empty(type) : new SettableValue(value, ClassUtils.getUserClass(value)); + return new SettableValue(Parameter.fromOrEmpty(value, type)); } /** @@ -74,7 +68,7 @@ public class SettableValue { Assert.notNull(type, "Type must not be null"); - return new SettableValue(null, type); + return new SettableValue(Parameter.empty(type)); } /** @@ -85,7 +79,7 @@ public class SettableValue { */ @Nullable public Object getValue() { - return this.value; + return this.parameter.getValue(); } /** @@ -94,7 +88,7 @@ public class SettableValue { * @return the column value type */ public Class getType() { - return this.type; + return this.parameter.getType(); } /** @@ -103,7 +97,7 @@ public class SettableValue { * @return whether this {@link SettableValue} has a value. {@literal false} if {@link #getValue()} is {@literal null}. */ public boolean hasValue() { - return this.value != null; + return this.parameter.hasValue(); } /** @@ -112,7 +106,7 @@ public class SettableValue { * @return whether this {@link SettableValue} is empty. {@literal true} if {@link #getValue()} is {@literal null}. */ public boolean isEmpty() { - return this.value == null; + return this.parameter.isEmpty(); } @Override @@ -122,21 +116,16 @@ public class SettableValue { if (!(o instanceof SettableValue)) return false; SettableValue value1 = (SettableValue) o; - return ObjectUtils.nullSafeEquals(this.value, value1.value) && ObjectUtils.nullSafeEquals(this.type, value1.type); + return this.parameter.equals(value1.parameter); } @Override public int hashCode() { - return Objects.hash(this.value, this.type); + return this.parameter.hashCode(); } @Override public String toString() { - final StringBuffer sb = new StringBuffer(); - sb.append("SettableValue"); - sb.append("[value=").append(this.value); - sb.append(", type=").append(this.type); - sb.append(']'); - return sb.toString(); + return this.parameter.toString(); } } diff --git a/src/main/java/org/springframework/data/r2dbc/query/BoundAssignments.java b/src/main/java/org/springframework/data/r2dbc/query/BoundAssignments.java index a770e3e..ac19611 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/BoundAssignments.java +++ b/src/main/java/org/springframework/data/r2dbc/query/BoundAssignments.java @@ -17,8 +17,8 @@ package org.springframework.data.r2dbc.query; import java.util.List; -import org.springframework.data.r2dbc.dialect.Bindings; import org.springframework.data.relational.core.sql.Assignment; +import org.springframework.r2dbc.core.binding.Bindings; import org.springframework.util.Assert; /** diff --git a/src/main/java/org/springframework/data/r2dbc/query/BoundCondition.java b/src/main/java/org/springframework/data/r2dbc/query/BoundCondition.java index 4ec658e..2f63022 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/BoundCondition.java +++ b/src/main/java/org/springframework/data/r2dbc/query/BoundCondition.java @@ -15,7 +15,7 @@ */ package org.springframework.data.r2dbc.query; -import org.springframework.data.r2dbc.dialect.Bindings; +import org.springframework.r2dbc.core.binding.Bindings; import org.springframework.data.relational.core.sql.Condition; import org.springframework.util.Assert; diff --git a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java index ab8f735..0fa732d 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java @@ -29,10 +29,6 @@ import org.springframework.data.mapping.PropertyPath; import org.springframework.data.mapping.PropertyReferenceException; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.r2dbc.convert.R2dbcConverter; -import org.springframework.data.r2dbc.dialect.BindMarker; -import org.springframework.data.r2dbc.dialect.BindMarkers; -import org.springframework.data.r2dbc.dialect.Bindings; -import org.springframework.data.r2dbc.dialect.MutableBindings; import org.springframework.data.r2dbc.dialect.R2dbcDialect; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.relational.core.dialect.Escaper; @@ -46,6 +42,11 @@ import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.Pair; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.Parameter; +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.Bindings; +import org.springframework.r2dbc.core.binding.MutableBindings; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -351,6 +352,12 @@ public class QueryMapper { mappedValue = convertValue(settableValue.getValue(), propertyField.getTypeHint()); typeHint = getTypeHint(mappedValue, actualType.getType(), settableValue); + } else if (criteria.getValue() instanceof Parameter) { + + Parameter parameter = (Parameter) criteria.getValue(); + + mappedValue = convertValue(parameter.getValue(), propertyField.getTypeHint()); + typeHint = getTypeHint(mappedValue, actualType.getType(), parameter); } else if (criteria.getValue() instanceof ValueFunction) { ValueFunction valueFunction = (ValueFunction) criteria.getValue(); @@ -391,6 +398,22 @@ public class QueryMapper { return SettableValue.from(convertValue(value.getValue(), ClassTypeInformation.OBJECT)); } + /** + * Potentially convert the {@link SettableValue}. + * + * @param value + * @return + * @since 1.2 + */ + public Parameter getBindValue(Parameter value) { + + if (value.isEmpty()) { + return Parameter.empty(converter.getTargetType(value.getType())); + } + + return Parameter.from(convertValue(value.getValue(), ClassTypeInformation.OBJECT)); + } + @Nullable protected Object convertValue(@Nullable Object value, TypeInformation typeInformation) { @@ -572,6 +595,19 @@ public class QueryMapper { return propertyType; } + Class getTypeHint(@Nullable Object mappedValue, Class propertyType, Parameter parameter) { + + if (mappedValue == null || propertyType.equals(Object.class)) { + return parameter.getType(); + } + + if (mappedValue.getClass().equals(parameter.getValue().getClass())) { + return parameter.getType(); + } + + return propertyType; + } + private Expression bind(@Nullable Object mappedValue, Class valueType, MutableBindings bindings, BindMarker bindMarker) { return bind(mappedValue, valueType, bindings, bindMarker, false); diff --git a/src/main/java/org/springframework/data/r2dbc/query/UpdateMapper.java b/src/main/java/org/springframework/data/r2dbc/query/UpdateMapper.java index 1504ec4..91861bb 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/UpdateMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/query/UpdateMapper.java @@ -20,10 +20,10 @@ import java.util.List; import java.util.Map; import org.springframework.data.r2dbc.convert.R2dbcConverter; -import org.springframework.data.r2dbc.dialect.BindMarker; -import org.springframework.data.r2dbc.dialect.BindMarkers; -import org.springframework.data.r2dbc.dialect.Bindings; -import org.springframework.data.r2dbc.dialect.MutableBindings; +import org.springframework.r2dbc.core.Parameter; +import org.springframework.r2dbc.core.binding.BindMarkers; +import org.springframework.r2dbc.core.binding.Bindings; +import org.springframework.r2dbc.core.binding.MutableBindings; import org.springframework.data.r2dbc.dialect.R2dbcDialect; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.relational.core.dialect.Escaper; @@ -38,6 +38,7 @@ import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.data.relational.core.sql.Table; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.binding.BindMarker; import org.springframework.util.Assert; /** @@ -136,6 +137,13 @@ public class UpdateMapper extends QueryMapper { mappedValue = convertValue(settableValue.getValue(), propertyField.getTypeHint()); typeHint = getTypeHint(mappedValue, actualType.getType(), settableValue); + } else if (value instanceof Parameter) { + + Parameter parameter = (Parameter) value; + + mappedValue = convertValue(parameter.getValue(), propertyField.getTypeHint()); + typeHint = getTypeHint(mappedValue, actualType.getType(), parameter); + } else if (value instanceof ValueFunction) { ValueFunction valueFunction = (ValueFunction) value; diff --git a/src/main/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQuery.java b/src/main/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQuery.java index 8c4476d..7bb8102 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQuery.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQuery.java @@ -22,7 +22,6 @@ import java.util.List; import org.springframework.data.domain.Sort; import org.springframework.data.r2dbc.convert.R2dbcConverter; import org.springframework.data.r2dbc.core.DatabaseClient; -import org.springframework.data.r2dbc.core.PreparedOperation; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.relational.repository.query.RelationalEntityMetadata; import org.springframework.data.relational.repository.query.RelationalParameterAccessor; @@ -30,6 +29,7 @@ import org.springframework.data.relational.repository.query.RelationalParameters import org.springframework.data.repository.query.ResultProcessor; import org.springframework.data.repository.query.ReturnedType; import org.springframework.data.repository.query.parser.PartTree; +import org.springframework.r2dbc.core.PreparedOperation; /** * An {@link AbstractR2dbcQuery} implementation based on a {@link PartTree}. @@ -71,7 +71,7 @@ public class PartTreeR2dbcQuery extends AbstractR2dbcQuery { } } - /* + /* * (non-Javadoc) * @see org.springframework.data.r2dbc.repository.query.AbstractR2dbcQuery#isModifyingQuery() */ @@ -80,7 +80,7 @@ public class PartTreeR2dbcQuery extends AbstractR2dbcQuery { return this.tree.isDelete(); } - /* + /* * (non-Javadoc) * @see org.springframework.data.r2dbc.repository.query.AbstractR2dbcQuery#createQuery(org.springframework.data.relational.repository.query.RelationalParameterAccessor) */ diff --git a/src/main/java/org/springframework/data/r2dbc/repository/query/PreparedOperationBindableQuery.java b/src/main/java/org/springframework/data/r2dbc/repository/query/PreparedOperationBindableQuery.java index 2a4c907..054da8f 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/query/PreparedOperationBindableQuery.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/query/PreparedOperationBindableQuery.java @@ -16,8 +16,8 @@ package org.springframework.data.r2dbc.repository.query; import org.springframework.data.r2dbc.core.DatabaseClient; -import org.springframework.data.r2dbc.core.PreparedOperation; import org.springframework.data.r2dbc.dialect.BindTarget; +import org.springframework.r2dbc.core.PreparedOperation; import org.springframework.util.Assert; /** diff --git a/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryCreator.java b/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryCreator.java index 397fc9c..9162908 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryCreator.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryCreator.java @@ -22,19 +22,23 @@ import java.util.stream.Collectors; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.data.r2dbc.core.PreparedOperation; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.r2dbc.core.StatementMapper; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.query.Criteria; -import org.springframework.data.relational.core.sql.*; +import org.springframework.data.relational.core.sql.Column; +import org.springframework.data.relational.core.sql.Expression; +import org.springframework.data.relational.core.sql.Functions; +import org.springframework.data.relational.core.sql.SqlIdentifier; +import org.springframework.data.relational.core.sql.Table; import org.springframework.data.relational.repository.query.RelationalEntityMetadata; import org.springframework.data.relational.repository.query.RelationalParameterAccessor; import org.springframework.data.relational.repository.query.RelationalQueryCreator; import org.springframework.data.repository.query.parser.AbstractQueryCreator; import org.springframework.data.repository.query.parser.PartTree; import org.springframework.lang.Nullable; +import org.springframework.r2dbc.core.PreparedOperation; /** * Implementation of {@link AbstractQueryCreator} that creates {@link PreparedOperation} from a {@link PartTree}. @@ -56,7 +60,7 @@ class R2dbcQueryCreator extends RelationalQueryCreator> { /** * Creates new instance of this class with the given {@link PartTree}, {@link ReactiveDataAccessStrategy}, * {@link RelationalEntityMetadata} and {@link RelationalParameterAccessor}. - * + * * @param tree part tree, must not be {@literal null}. * @param dataAccessStrategy data access strategy, must not be {@literal null}. * @param entityMetadata relational entity metadata, must not be {@literal null}. diff --git a/src/main/java/org/springframework/data/r2dbc/support/AbstractFallbackR2dbcExceptionTranslator.java b/src/main/java/org/springframework/data/r2dbc/support/AbstractFallbackR2dbcExceptionTranslator.java index 33bf677..7d7ce64 100644 --- a/src/main/java/org/springframework/data/r2dbc/support/AbstractFallbackR2dbcExceptionTranslator.java +++ b/src/main/java/org/springframework/data/r2dbc/support/AbstractFallbackR2dbcExceptionTranslator.java @@ -31,7 +31,11 @@ import org.springframework.util.Assert; * {@link R2dbcExceptionTranslator}. * * @author Mark Paluch + * @deprecated since 1.2. Use Spring R2DBC's + * {@link org.springframework.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException(String, String, R2dbcException)} + * instead. */ +@Deprecated public abstract class AbstractFallbackR2dbcExceptionTranslator implements R2dbcExceptionTranslator { /** Logger available to subclasses */ diff --git a/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionSubclassTranslator.java b/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionSubclassTranslator.java index 8289fa6..540af8c 100644 --- a/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionSubclassTranslator.java +++ b/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionSubclassTranslator.java @@ -43,7 +43,11 @@ import org.springframework.lang.Nullable; * Falls back to a standard {@link SqlStateR2dbcExceptionTranslator}. * * @author Mark Paluch + * @deprecated since 1.2. Use Spring R2DBC's + * {@link org.springframework.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException(String, String, R2dbcException)} + * instead. */ +@Deprecated public class R2dbcExceptionSubclassTranslator extends AbstractFallbackR2dbcExceptionTranslator { public R2dbcExceptionSubclassTranslator() { diff --git a/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionTranslator.java b/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionTranslator.java index dd42f4d..1ab81d1 100644 --- a/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionTranslator.java +++ b/src/main/java/org/springframework/data/r2dbc/support/R2dbcExceptionTranslator.java @@ -31,8 +31,12 @@ import org.springframework.lang.Nullable; * @see org.springframework.dao.DataAccessException * @see SqlStateR2dbcExceptionTranslator * @see SqlErrorCodeR2dbcExceptionTranslator + * @deprecated since 1.2. Use Spring R2DBC's + * {@link org.springframework.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException(String, String, R2dbcException)} + * instead. */ @FunctionalInterface +@Deprecated public interface R2dbcExceptionTranslator { /** diff --git a/src/main/java/org/springframework/data/r2dbc/support/SqlErrorCodeR2dbcExceptionTranslator.java b/src/main/java/org/springframework/data/r2dbc/support/SqlErrorCodeR2dbcExceptionTranslator.java index b43c1d6..f818cc9 100644 --- a/src/main/java/org/springframework/data/r2dbc/support/SqlErrorCodeR2dbcExceptionTranslator.java +++ b/src/main/java/org/springframework/data/r2dbc/support/SqlErrorCodeR2dbcExceptionTranslator.java @@ -60,7 +60,11 @@ import org.springframework.lang.Nullable; * @author Mark Paluch * @see SQLErrorCodesFactory * @see SqlStateR2dbcExceptionTranslator + * @deprecated since 1.2. Use Spring R2DBC's + * {@link org.springframework.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException(String, String, R2dbcException)} + * instead. */ +@Deprecated public class SqlErrorCodeR2dbcExceptionTranslator extends AbstractFallbackR2dbcExceptionTranslator { /** Error codes used by this translator */ diff --git a/src/main/java/org/springframework/data/r2dbc/support/SqlStateR2dbcExceptionTranslator.java b/src/main/java/org/springframework/data/r2dbc/support/SqlStateR2dbcExceptionTranslator.java index ec73fdb..cfa30f7 100644 --- a/src/main/java/org/springframework/data/r2dbc/support/SqlStateR2dbcExceptionTranslator.java +++ b/src/main/java/org/springframework/data/r2dbc/support/SqlStateR2dbcExceptionTranslator.java @@ -40,7 +40,11 @@ import org.springframework.lang.Nullable; * @author Mark Paluch * @see io.r2dbc.spi.R2dbcException#getSqlState() * @see SqlErrorCodeR2dbcExceptionTranslator + * @deprecated since 1.2. Use Spring R2DBC's + * {@link org.springframework.r2dbc.connection.ConnectionFactoryUtils#convertR2dbcException(String, String, R2dbcException)} + * instead. */ +@Deprecated public class SqlStateR2dbcExceptionTranslator extends AbstractFallbackR2dbcExceptionTranslator { private static final Set BAD_SQL_GRAMMAR_CODES = new HashSet<>(8); diff --git a/src/test/java/org/springframework/data/r2dbc/core/NamedParameterUtilsUnitTests.java b/src/test/java/org/springframework/data/r2dbc/core/NamedParameterUtilsUnitTests.java index 84ddb94..6f99a8e 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/NamedParameterUtilsUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/NamedParameterUtilsUnitTests.java @@ -26,11 +26,11 @@ import java.util.Map; import org.junit.Test; -import org.springframework.data.r2dbc.dialect.BindMarkersFactory; import org.springframework.data.r2dbc.dialect.BindTarget; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.dialect.SqlServerDialect; import org.springframework.data.r2dbc.mapping.SettableValue; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; diff --git a/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTests.java b/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTests.java index 93b31a6..ed69b3d 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTests.java @@ -31,6 +31,7 @@ import org.springframework.data.r2dbc.dialect.MySqlDialect; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.Update; +import org.springframework.r2dbc.core.PreparedOperation; /** * Unit tests for {@link ReactiveDataAccessStrategy}. diff --git a/src/test/java/org/springframework/data/r2dbc/core/StatementMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/core/StatementMapperUnitTests.java index 0aa08f9..b9f1416 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/StatementMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/StatementMapperUnitTests.java @@ -27,6 +27,7 @@ import org.springframework.data.r2dbc.dialect.BindTarget; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.Update; +import org.springframework.r2dbc.core.PreparedOperation; /** * Unit tests for {@link DefaultStatementMapper}. diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkersUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkersUnitTests.java deleted file mode 100644 index af0d892..0000000 --- a/src/test/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkersUnitTests.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2019-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.r2dbc.dialect; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.Test; - -/** - * Unit tests for {@link AnonymousBindMarkers}. - * - * @author Mark Paluch - */ -public class AnonymousBindMarkersUnitTests { - - @Test // gh-75 - public void shouldCreateNewBindMarkers() { - - BindMarkersFactory factory = BindMarkersFactory.anonymous("?"); - - BindMarkers bindMarkers1 = factory.create(); - BindMarkers bindMarkers2 = factory.create(); - - assertThat(bindMarkers1.next().getPlaceholder()).isEqualTo("?"); - assertThat(bindMarkers2.next().getPlaceholder()).isEqualTo("?"); - } - - @Test // gh-75 - public void shouldBindByIndex() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.anonymous("?").create(); - - BindMarker first = bindMarkers.next(); - BindMarker second = bindMarkers.next(); - - second.bind(bindTarget, "foo"); - first.bindNull(bindTarget, Object.class); - - verify(bindTarget).bindNull(0, Object.class); - verify(bindTarget).bind(1, "foo"); - } -} diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkersUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkersUnitTests.java deleted file mode 100644 index 924f3d5..0000000 --- a/src/test/java/org/springframework/data/r2dbc/dialect/IndexedBindMarkersUnitTests.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.springframework.data.r2dbc.dialect; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.Test; - -/** - * Unit tests for {@link IndexedBindMarkers}. - * - * @author Mark Paluch - */ -public class IndexedBindMarkersUnitTests { - - @Test // gh-15 - public void shouldCreateNewBindMarkers() { - - BindMarkersFactory factory = BindMarkersFactory.indexed("$", 0); - - BindMarkers bindMarkers1 = factory.create(); - BindMarkers bindMarkers2 = factory.create(); - - assertThat(bindMarkers1.next().getPlaceholder()).isEqualTo("$0"); - assertThat(bindMarkers2.next().getPlaceholder()).isEqualTo("$0"); - } - - @Test // gh-15 - public void shouldCreateNewBindMarkersWithOffset() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.indexed("$", 1).create(); - - BindMarker first = bindMarkers.next(); - first.bind(bindTarget, "foo"); - - BindMarker second = bindMarkers.next(); - second.bind(bindTarget, "bar"); - - assertThat(first.getPlaceholder()).isEqualTo("$1"); - assertThat(second.getPlaceholder()).isEqualTo("$2"); - verify(bindTarget).bind(0, "foo"); - verify(bindTarget).bind(1, "bar"); - } - - @Test // gh-15 - public void nextShouldIncrementBindMarker() { - - String[] prefixes = { "$", "?" }; - - for (String prefix : prefixes) { - - BindMarkers bindMarkers = BindMarkersFactory.indexed(prefix, 0).create(); - - BindMarker marker1 = bindMarkers.next(); - BindMarker marker2 = bindMarkers.next(); - - assertThat(marker1.getPlaceholder()).isEqualTo(prefix + "0"); - assertThat(marker2.getPlaceholder()).isEqualTo(prefix + "1"); - } - } - - @Test // gh-15 - public void bindValueShouldBindByIndex() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.indexed("$", 0).create(); - - bindMarkers.next().bind(bindTarget, "foo"); - bindMarkers.next().bind(bindTarget, "bar"); - - verify(bindTarget).bind(0, "foo"); - verify(bindTarget).bind(1, "bar"); - } - - @Test // gh-15 - public void bindNullShouldBindByIndex() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.indexed("$", 0).create(); - - bindMarkers.next(); // ignore - - bindMarkers.next().bindNull(bindTarget, Integer.class); - - verify(bindTarget).bindNull(1, Integer.class); - } -} diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/NamedBindMarkersUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/NamedBindMarkersUnitTests.java deleted file mode 100644 index 52729fa..0000000 --- a/src/test/java/org/springframework/data/r2dbc/dialect/NamedBindMarkersUnitTests.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.springframework.data.r2dbc.dialect; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.Test; - -/** - * Unit tests for {@link NamedBindMarkers}. - * - * @author Mark Paluch - */ -public class NamedBindMarkersUnitTests { - - @Test // gh-15 - public void shouldCreateNewBindMarkers() { - - BindMarkersFactory factory = BindMarkersFactory.named("@", "p", 32); - - BindMarkers bindMarkers1 = factory.create(); - BindMarkers bindMarkers2 = factory.create(); - - assertThat(bindMarkers1.next().getPlaceholder()).isEqualTo("@p0"); - assertThat(bindMarkers2.next().getPlaceholder()).isEqualTo("@p0"); - } - - @Test // gh-15 - public void nextShouldIncrementBindMarker() { - - String[] prefixes = { "$", "?" }; - - for (String prefix : prefixes) { - - BindMarkers bindMarkers = BindMarkersFactory.named(prefix, "p", 32).create(); - - BindMarker marker1 = bindMarkers.next(); - BindMarker marker2 = bindMarkers.next(); - - assertThat(marker1.getPlaceholder()).isEqualTo(prefix + "p0"); - assertThat(marker2.getPlaceholder()).isEqualTo(prefix + "p1"); - } - } - - @Test // gh-15 - public void nextShouldConsiderNameHint() { - - BindMarkers bindMarkers = BindMarkersFactory.named("@", "x", 32).create(); - - BindMarker marker1 = bindMarkers.next("foo1bar"); - BindMarker marker2 = bindMarkers.next(); - - assertThat(marker1.getPlaceholder()).isEqualTo("@x0foo1bar"); - assertThat(marker2.getPlaceholder()).isEqualTo("@x1"); - } - - @Test // gh-15 - public void nextShouldConsiderFilteredNameHint() { - - BindMarkers bindMarkers = BindMarkersFactory.named("@", "p", 32, s -> { - - return s.chars().filter(Character::isAlphabetic) - .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString(); - - }).create(); - - BindMarker marker1 = bindMarkers.next("foo1.bar?"); - BindMarker marker2 = bindMarkers.next(); - - assertThat(marker1.getPlaceholder()).isEqualTo("@p0foobar"); - assertThat(marker2.getPlaceholder()).isEqualTo("@p1"); - } - - @Test // gh-15 - public void nextShouldConsiderNameLimit() { - - BindMarkers bindMarkers = BindMarkersFactory.named("@", "p", 10).create(); - - BindMarker marker1 = bindMarkers.next("123456789"); - - assertThat(marker1.getPlaceholder()).isEqualTo("@p012345678"); - } - - @Test // gh-15 - public void bindValueShouldBindByName() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.named("@", "p", 32).create(); - - bindMarkers.next().bind(bindTarget, "foo"); - bindMarkers.next().bind(bindTarget, "bar"); - - verify(bindTarget).bind("p0", "foo"); - verify(bindTarget).bind("p1", "bar"); - } - - @Test // gh-15 - public void bindNullShouldBindByName() { - - BindTarget bindTarget = mock(BindTarget.class); - - BindMarkers bindMarkers = BindMarkersFactory.named("@", "p", 32).create(); - - bindMarkers.next(); // ignore - bindMarkers.next().bindNull(bindTarget, Integer.class); - - verify(bindTarget).bindNull("p1", Integer.class); - } -} diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java index a079bfc..afaba8d 100644 --- a/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java @@ -6,8 +6,11 @@ import static org.assertj.core.api.SoftAssertions.*; import java.util.List; import org.junit.Test; + import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.relational.core.dialect.ArrayColumns; +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; /** * Unit tests for {@link PostgresDialect}. diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/SqlServerDialectUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/SqlServerDialectUnitTests.java index 502083e..01e091a 100644 --- a/src/test/java/org/springframework/data/r2dbc/dialect/SqlServerDialectUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/dialect/SqlServerDialectUnitTests.java @@ -7,6 +7,8 @@ import java.util.UUID; import org.junit.Test; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.relational.core.dialect.ArrayColumns; +import org.springframework.r2dbc.core.binding.BindMarker; +import org.springframework.r2dbc.core.binding.BindMarkers; /** * Unit tests for {@link SqlServerDialect}.