From da53a9a934a8be52d116da8ddfc585c0accf2047 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 8 May 2019 10:36:21 +0200 Subject: [PATCH] #64 - Polishing. Incorporated feedback from review. Polished documentation and Javadoc. Minor code improvements restructuring for better readability. Removed unused methods types. Some polishing for compiler warnings. Original pull request: #106. --- src/main/asciidoc/reference/r2dbc-core.adoc | 4 +- .../reference/r2dbc-databaseclient.adoc | 21 ++++++++-- .../data/r2dbc/BadSqlGrammarException.java | 2 + .../r2dbc/UncategorizedR2dbcException.java | 2 + .../r2dbc/function/DefaultDatabaseClient.java | 42 ++++++------------- .../function/DefaultStatementFactory.java | 35 ---------------- .../convert/MappingR2dbcConverter.java | 40 +++++++++--------- .../data/r2dbc/function/query/Criteria.java | 27 +++++++----- .../r2dbc/function/query/QueryMapper.java | 18 ++++---- .../data/r2dbc/function/query/Update.java | 33 +++++++-------- .../repository/query/R2dbcQueryMethod.java | 3 ++ .../function/query/CriteriaUnitTests.java | 4 +- .../function/query/QueryMapperUnitTests.java | 2 - .../function/query/UpdateMapperUnitTests.java | 2 - 14 files changed, 100 insertions(+), 135 deletions(-) delete mode 100644 src/main/java/org/springframework/data/r2dbc/function/DefaultStatementFactory.java diff --git a/src/main/asciidoc/reference/r2dbc-core.adoc b/src/main/asciidoc/reference/r2dbc-core.adoc index 87466e3..249c4cb 100644 --- a/src/main/asciidoc/reference/r2dbc-core.adoc +++ b/src/main/asciidoc/reference/r2dbc-core.adoc @@ -236,6 +236,6 @@ As of writing the following drivers are available: * https://github.com/r2dbc/r2dbc-mssql[Microsoft SQL Server] (`io.r2dbc:r2dbc-mssql`) * https://github.com/jasync-sql/jasync-sql[Microsoft SQL Server] (`com.github.jasync-sql:jasync-r2dbc-mysql`) -Spring Data R2DBC reacts to database specifics by inspecting `ConnectionFactoryMetadata` and selects the appropriate database dialect. -You can configure an own `Dialect` if the used driver is not yet known to Spring Data R2DBC. +Spring Data R2DBC reacts to database specifics by inspecting `ConnectionFactoryMetadata` exposed by the `ConnectionFactory` and selects the appropriate database dialect accordingly. +You can configure an own https://docs.spring.io/spring-data/r2dbc/docs/{version}/api/org/springframework/data/r2dbc/dialect/Dialect.html[`Dialect`] if the used driver is not yet known to Spring Data R2DBC. diff --git a/src/main/asciidoc/reference/r2dbc-databaseclient.adoc b/src/main/asciidoc/reference/r2dbc-databaseclient.adoc index 5cbb865..2809ac1 100644 --- a/src/main/asciidoc/reference/r2dbc-databaseclient.adoc +++ b/src/main/asciidoc/reference/r2dbc-databaseclient.adoc @@ -24,10 +24,10 @@ DatabaseClient.create(ConnectionFactory connectionFactory) The above method creates a `DatabaseClient` with default settings. -You can also use `DatabaseClient.builder()` with further options to customize the client: +You can also obtain a `Builder` instance via `DatabaseClient.builder()` with further options to customize the client by calling the following methods: -* `exceptionTranslator`: Supply a specific `R2dbcExceptionTranslator` to customize how R2DBC exceptions are translated into Spring's portable Data Access Exception hierarchy. See "`<>`" for more information. -* `dataAccessStrategy`: Strategy how SQL queries are generated and how objects are mapped. +* `….exceptionTranslator(…)`: Supply a specific `R2dbcExceptionTranslator` to customize how R2DBC exceptions are translated into Spring's portable Data Access Exception hierarchy. See "`<>`" for more information. +* `….dataAccessStrategy(…)`: Strategy how SQL queries are generated and how objects are mapped. Once built, a `DatabaseClient` instance is immutable. However, you can clone it and build a modified copy without affecting the original instance, as the following example shows: @@ -50,6 +50,19 @@ When you use Spring Data R2DBC, you can create a `ConnectionFactory` using your `ConnectionFactory` implementations can either return the same connection, different connections or provide connection pooling. `DatabaseClient` uses `ConnectionFactory` to create and release connections per operation without affinity to a particular connection across multiple operations. +Assuming you'd be using H2 as a database, a typical programmatic setup looks something like this: + +[source, java] +---- +H2ConnectionConfiguration config = … <1> +ConnectionFactory factory = new H2ConnectionFactory(config); <2> + +DatabaseClient client = DatabaseClient.create(factory); <3> +---- +<1> Prepare the database specific configuration (host, port, credentials etc.) +<2> Create a connection factory using that configuration. +<3> Create a `DatabaseClient` to use that connection factory. + [[r2dbc.exception]] = Exception Translation @@ -66,7 +79,7 @@ It considers R2DBC's categorized exception hierarchy to translate these into Spr `SqlErrorCodeR2dbcExceptionTranslator` uses specific vendor codes using Spring JDBC's `SQLErrorCodes`. It is more precise than the SQLState implementation. The error code translations are based on codes held in a JavaBean type class called `SQLErrorCodes`. -This class is created and populated by an `SQLErrorCodesFactory`, which (as the name suggests) is a factory for creating SQLErrorCodes based on the contents of a configuration file named `sql-error-codes.xml` from Spring's Data Access module. +Instances of this class are created and populated by an `SQLErrorCodesFactory`, which (as the name suggests) is a factory for creating SQLErrorCodes based on the contents of a configuration file named `sql-error-codes.xml` from Spring's Data Access module. This file is populated with vendor codes and based on the `ConnectionFactoryName` taken from `ConnectionFactoryMetadata`. The codes for the actual database you are using are used. diff --git a/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java b/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java index 9e7e6f7..becd75b 100644 --- a/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java +++ b/src/main/java/org/springframework/data/r2dbc/BadSqlGrammarException.java @@ -31,6 +31,8 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; */ public class BadSqlGrammarException extends InvalidDataAccessResourceUsageException { + private static final long serialVersionUID = 3814579246913482054L; + private final 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 8e05142..8833775 100644 --- a/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java +++ b/src/main/java/org/springframework/data/r2dbc/UncategorizedR2dbcException.java @@ -27,6 +27,8 @@ import org.springframework.lang.Nullable; */ public class UncategorizedR2dbcException extends UncategorizedDataAccessException { + private static final long serialVersionUID = 361587356435210266L; + /** * SQL that led to the problem */ diff --git a/src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java b/src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java index 4db374c..51383c6 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java +++ b/src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java @@ -45,7 +45,6 @@ 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; @@ -232,7 +231,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { protected DataAccessException translateException(String task, @Nullable String sql, R2dbcException ex) { DataAccessException dae = this.exceptionTranslator.translate(task, sql, ex); - return (dae != null ? dae : new UncategorizedR2dbcException(task, sql, ex)); + return dae != null ? dae : new UncategorizedR2dbcException(task, sql, ex); } /** @@ -267,25 +266,6 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { return new DefaultGenericExecuteSpec(sqlSupplier); } - private static void doBind(Statement statement, Map byName, - Map byIndex) { - - bindByIndex(statement, byIndex); - bindByName(statement, byName); - } - - private static void bindByName(Statement statement, Map byName) { - - byName.forEach((name, o) -> { - - if (o.getValue() != null) { - statement.bind(name, o.getValue()); - } else { - statement.bindNull(name, o.getType()); - } - }); - } - private static void bindByIndex(Statement statement, Map byIndex) { byIndex.forEach((i, o) -> { @@ -591,7 +571,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { @Override public DefaultTypedExecuteSpec bind(String name, Object value) { - return (DefaultTypedExecuteSpec) super.bind(name, value); + return (DefaultTypedExecuteSpec) super.bind(name, value); } @Override @@ -789,14 +769,11 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { this.mappingFunction = dataAccessStrategy.getRowMapper(typeToRead); } - DefaultTypedSelectSpec(String table, List projectedFields, Criteria criteria, Sort sort, Pageable page, - BiFunction mappingFunction) { - this(table, projectedFields, criteria, sort, page, null, mappingFunction); - } - DefaultTypedSelectSpec(String table, List projectedFields, Criteria criteria, Sort sort, Pageable page, Class typeToRead, BiFunction mappingFunction) { + super(table, projectedFields, criteria, sort, page); + this.typeToRead = typeToRead; this.mappingFunction = mappingFunction; } @@ -900,13 +877,14 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { private final BiFunction mappingFunction; @Override - public GenericInsertSpec value(String field, Object value) { + public GenericInsertSpec value(String field, Object value) { Assert.notNull(field, "Field must not be null!"); Assert.notNull(value, () -> String.format("Value for field %s must not be null. Use nullValue(…) instead.", field)); Map byName = new LinkedHashMap<>(this.byName); + if (value instanceof SettableValue) { byName.put(field, (SettableValue) value); } else { @@ -917,7 +895,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { } @Override - public GenericInsertSpec nullValue(String field) { + public GenericInsertSpec nullValue(String field) { Assert.notNull(field, "Field must not be null!"); @@ -991,6 +969,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { } @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) public InsertSpec using(T objectToInsert) { Assert.notNull(objectToInsert, "Object to insert must not be null!"); @@ -1000,6 +979,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { } @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) public InsertSpec using(Publisher objectToInsert) { Assert.notNull(objectToInsert, "Publisher to insert must not be null!"); @@ -1417,7 +1397,7 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { if (method.getName().equals("equals")) { // Only consider equal when proxies are identical. - return (proxy == args[0]); + return proxy == args[0]; } else if (method.getName().equals("hashCode")) { // Use hashCode of PersistenceManager proxy. return System.identityHashCode(proxy); @@ -1454,6 +1434,8 @@ class DefaultDatabaseClient implements DatabaseClient, ConnectionAccessor { @RequiredArgsConstructor static class ConnectionCloseHolder extends AtomicBoolean { + private static final long serialVersionUID = -8994138383301201380L; + final Connection connection; final Function> closeFunction; diff --git a/src/main/java/org/springframework/data/r2dbc/function/DefaultStatementFactory.java b/src/main/java/org/springframework/data/r2dbc/function/DefaultStatementFactory.java deleted file mode 100644 index 5e713db..0000000 --- a/src/main/java/org/springframework/data/r2dbc/function/DefaultStatementFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019 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.function; - -import lombok.RequiredArgsConstructor; - -import org.springframework.data.r2dbc.dialect.Dialect; -import org.springframework.data.relational.core.sql.render.RenderContext; - -/** - * Default {@link StatementFactory} implementation. - * - * @author Mark Paluch - */ -// TODO: Move DefaultPreparedOperation et al to a better place. Probably StatementMapper. -@RequiredArgsConstructor -class DefaultStatementFactory { - - private final Dialect dialect; - private final RenderContext renderContext; - -} diff --git a/src/main/java/org/springframework/data/r2dbc/function/convert/MappingR2dbcConverter.java b/src/main/java/org/springframework/data/r2dbc/function/convert/MappingR2dbcConverter.java index 25604da..003d327 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/convert/MappingR2dbcConverter.java +++ b/src/main/java/org/springframework/data/r2dbc/function/convert/MappingR2dbcConverter.java @@ -55,6 +55,7 @@ import org.springframework.util.ClassUtils; * Converter for R2DBC. * * @author Mark Paluch + * @author Oliver Drotbohm */ public class MappingR2dbcConverter extends BasicRelationalConverter implements R2dbcConverter { @@ -176,21 +177,21 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R return getConversionService().convert(value, target); } + @SuppressWarnings("unchecked") private S readEntityFrom(Row row, PersistentProperty property) { String prefix = property.getName() + "_"; - RelationalPersistentEntity entity = (RelationalPersistentEntity) getMappingContext() - .getRequiredPersistentEntity(property.getActualType()); + RelationalPersistentEntity entity = getMappingContext().getRequiredPersistentEntity(property.getActualType()); if (readFrom(row, entity.getRequiredIdProperty(), prefix) == null) { return null; } - S instance = createInstance(row, prefix, entity); + Object instance = createInstance(row, prefix, entity); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(instance); - ConvertingPropertyAccessor propertyAccessor = new ConvertingPropertyAccessor<>(accessor, getConversionService()); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(instance); + ConvertingPropertyAccessor propertyAccessor = new ConvertingPropertyAccessor<>(accessor, getConversionService()); for (RelationalPersistentProperty p : entity) { if (!entity.isConstructorArgument(property)) { @@ -198,7 +199,7 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R } } - return instance; + return (S) instance; } private S createInstance(Row row, String prefix, RelationalPersistentEntity entity) { @@ -346,17 +347,16 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R return (row, metadata) -> { - PersistentPropertyAccessor propertyAccessor = entity.getPropertyAccessor(object); + PersistentPropertyAccessor propertyAccessor = entity.getPropertyAccessor(object); RelationalPersistentProperty idProperty = entity.getRequiredIdProperty(); - if (propertyAccessor.getProperty(idProperty) == null) { - - if (potentiallySetId(row, metadata, propertyAccessor, idProperty)) { - return (T) propertyAccessor.getBean(); - } + if (propertyAccessor.getProperty(idProperty) != null) { + return object; } - return object; + return potentiallySetId(row, metadata, propertyAccessor, idProperty) // + ? (T) propertyAccessor.getBean() // + : object; }; } @@ -376,19 +376,19 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R generatedIdValue = row.get(key); } - if (generatedIdValue != null) { - - ConversionService conversionService = getConversionService(); - propertyAccessor.setProperty(idProperty, conversionService.convert(generatedIdValue, idProperty.getType())); - return true; + if (generatedIdValue == null) { + return false; } - return false; + ConversionService conversionService = getConversionService(); + propertyAccessor.setProperty(idProperty, conversionService.convert(generatedIdValue, idProperty.getType())); + + return true; } @SuppressWarnings("unchecked") private RelationalPersistentEntity getRequiredPersistentEntity(Class type) { - return (RelationalPersistentEntity) getMappingContext().getRequiredPersistentEntity(type); + return (RelationalPersistentEntity) getMappingContext().getRequiredPersistentEntity(type); } private static Map createMetadataMap(RowMetadata metadata) { diff --git a/src/main/java/org/springframework/data/r2dbc/function/query/Criteria.java b/src/main/java/org/springframework/data/r2dbc/function/query/Criteria.java index 30fa6a1..be48f74 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/query/Criteria.java +++ b/src/main/java/org/springframework/data/r2dbc/function/query/Criteria.java @@ -30,6 +30,7 @@ import org.springframework.util.Assert; * {@code where(property(…).is(…)}. * * @author Mark Paluch + * @author Oliver Drotbohm */ public class Criteria { @@ -164,7 +165,7 @@ public class Criteria { /** * Creates a {@link Criteria} using equality. * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria is(Object value); @@ -172,7 +173,7 @@ public class Criteria { /** * Creates a {@link Criteria} using equality (is not). * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria not(Object value); @@ -180,7 +181,7 @@ public class Criteria { /** * Creates a {@link Criteria} using {@code IN}. * - * @param values + * @param values must not be {@literal null}. * @return */ Criteria in(Object... values); @@ -188,7 +189,7 @@ public class Criteria { /** * Creates a {@link Criteria} using {@code IN}. * - * @param values + * @param values must not be {@literal null}. * @return */ Criteria in(Collection values); @@ -196,7 +197,7 @@ public class Criteria { /** * Creates a {@link Criteria} using {@code NOT IN}. * - * @param values + * @param values must not be {@literal null}. * @return */ Criteria notIn(Object... values); @@ -204,7 +205,7 @@ public class Criteria { /** * Creates a {@link Criteria} using {@code NOT IN}. * - * @param values + * @param values must not be {@literal null}. * @return */ Criteria notIn(Collection values); @@ -212,7 +213,7 @@ public class Criteria { /** * Creates a {@link Criteria} using less-than ({@literal <}). * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria lessThan(Object value); @@ -220,7 +221,7 @@ public class Criteria { /** * Creates a {@link Criteria} using less-than or equal to ({@literal <=}). * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria lessThanOrEquals(Object value); @@ -228,7 +229,7 @@ public class Criteria { /** * Creates a {@link Criteria} using greater-than({@literal >}). * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria greaterThan(Object value); @@ -236,7 +237,7 @@ public class Criteria { /** * Creates a {@link Criteria} using greater-than or equal to ({@literal >=}). * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria greaterThanOrEquals(Object value); @@ -244,7 +245,7 @@ public class Criteria { /** * Creates a {@link Criteria} using {@code LIKE}. * - * @param value + * @param value must not be {@literal null}. * @return */ Criteria like(Object value); @@ -304,6 +305,7 @@ public class Criteria { public Criteria in(Object... values) { Assert.notNull(values, "Values must not be null!"); + Assert.noNullElements(values, "Values must not contain a null value!"); if (values.length > 1 && values[1] instanceof Collection) { throw new InvalidDataAccessApiUsageException( @@ -321,6 +323,7 @@ public class Criteria { public Criteria in(Collection values) { Assert.notNull(values, "Values must not be null!"); + Assert.noNullElements(values.toArray(), "Values must not contain a null value!"); return createCriteria(Comparator.IN, values); } @@ -333,6 +336,7 @@ public class Criteria { public Criteria notIn(Object... values) { Assert.notNull(values, "Values must not be null!"); + Assert.noNullElements(values, "Values must not contain a null value!"); if (values.length > 1 && values[1] instanceof Collection) { throw new InvalidDataAccessApiUsageException( @@ -350,6 +354,7 @@ public class Criteria { public Criteria notIn(Collection values) { Assert.notNull(values, "Values must not be null!"); + Assert.noNullElements(values.toArray(), "Values must not contain a null value!"); return createCriteria(Comparator.NOT_IN, values); } diff --git a/src/main/java/org/springframework/data/r2dbc/function/query/QueryMapper.java b/src/main/java/org/springframework/data/r2dbc/function/query/QueryMapper.java index 18229f3..752a1d0 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/query/QueryMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/function/query/QueryMapper.java @@ -204,20 +204,22 @@ public class QueryMapper { private Condition createCondition(Column column, @Nullable Object mappedValue, Class valueType, MutableBindings bindings, Comparator comparator) { - switch (comparator) { - case IS_NULL: - return column.isNull(); - case IS_NOT_NULL: - return column.isNotNull(); + if (comparator.equals(Comparator.IS_NULL)) { + return column.isNull(); + } + + if (comparator.equals(Comparator.IS_NOT_NULL)) { + return column.isNotNull(); } if (comparator == Comparator.NOT_IN || comparator == Comparator.IN) { Condition condition; + if (mappedValue instanceof Iterable) { List expressions = new ArrayList<>( - mappedValue instanceof Collection ? ((Collection) mappedValue).size() : 10); + mappedValue instanceof Collection ? ((Collection) mappedValue).size() : 10); for (Object o : (Iterable) mappedValue) { @@ -260,9 +262,9 @@ public class QueryMapper { return column.isGreaterOrEqualTo(expression); case LIKE: return column.like(expression); + default: + throw new UnsupportedOperationException("Comparator " + comparator + " not supported"); } - - throw new UnsupportedOperationException("Comparator " + comparator + " not supported"); } Field createPropertyField(@Nullable RelationalPersistentEntity entity, String key, diff --git a/src/main/java/org/springframework/data/r2dbc/function/query/Update.java b/src/main/java/org/springframework/data/r2dbc/function/query/Update.java index be2f53b..6d59040 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/query/Update.java +++ b/src/main/java/org/springframework/data/r2dbc/function/query/Update.java @@ -18,7 +18,6 @@ package org.springframework.data.r2dbc.function.query; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -import java.util.function.BiConsumer; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -27,6 +26,7 @@ import org.springframework.util.Assert; * Class to easily construct SQL update assignments. * * @author Mark Paluch + * @author Oliver Drotbohm */ public class Update { @@ -41,8 +41,8 @@ public class Update { /** * Static factory method to create an {@link Update} using the provided column. * - * @param column - * @param value + * @param column must not be {@literal null}. + * @param value can be {@literal null}. * @return */ public static Update update(String column, @Nullable Object value) { @@ -52,14 +52,23 @@ public class Update { /** * Update a column by assigning a value. * - * @param column - * @param value + * @param column must not be {@literal null}. + * @param value can be {@literal null}. * @return */ public Update set(String column, @Nullable Object value) { return addMultiFieldOperation(column, value); } + /** + * Returns all assignments. + * + * @return + */ + public Map getAssignments() { + return Collections.unmodifiableMap(this.columnsToUpdate); + } + private Update addMultiFieldOperation(String key, Object value) { Assert.hasText(key, "Column for update must not be null or blank"); @@ -69,18 +78,4 @@ public class Update { return new Update(updates); } - - /** - * Performs the given action for each column-value tuple in this {@link Update object} until all entries have been - * processed or the action throws an exception. - * - * @param action must not be {@literal null}. - */ - void forEachColumn(BiConsumer action) { - this.columnsToUpdate.forEach(action); - } - - public Map getAssignments() { - return Collections.unmodifiableMap(this.columnsToUpdate); - } } diff --git a/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethod.java b/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethod.java index eb9db8f..3f33748 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethod.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethod.java @@ -51,7 +51,10 @@ import org.springframework.util.ClassUtils; */ public class R2dbcQueryMethod extends QueryMethod { + @SuppressWarnings("rawtypes") // private static final ClassTypeInformation PAGE_TYPE = ClassTypeInformation.from(Page.class); + + @SuppressWarnings("rawtypes") // private static final ClassTypeInformation SLICE_TYPE = ClassTypeInformation.from(Slice.class); private final Method method; diff --git a/src/test/java/org/springframework/data/r2dbc/function/query/CriteriaUnitTests.java b/src/test/java/org/springframework/data/r2dbc/function/query/CriteriaUnitTests.java index 32d190c..d001e43 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/query/CriteriaUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/query/CriteriaUnitTests.java @@ -21,8 +21,8 @@ import static org.springframework.data.r2dbc.function.query.Criteria.*; import java.util.Arrays; import org.junit.Test; - -import org.springframework.data.r2dbc.function.query.Criteria.*; +import org.springframework.data.r2dbc.function.query.Criteria.Combinator; +import org.springframework.data.r2dbc.function.query.Criteria.Comparator; /** * Unit tests for {@link Criteria}. diff --git a/src/test/java/org/springframework/data/r2dbc/function/query/QueryMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/function/query/QueryMapperUnitTests.java index 966ff4a..acef4b8 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/query/QueryMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/query/QueryMapperUnitTests.java @@ -20,7 +20,6 @@ import static org.mockito.Mockito.*; import static org.springframework.data.domain.Sort.Order.*; import org.junit.Test; - import org.springframework.data.domain.Sort; import org.springframework.data.r2dbc.dialect.BindMarkersFactory; import org.springframework.data.r2dbc.domain.BindTarget; @@ -227,7 +226,6 @@ public class QueryMapperUnitTests { assertThat(mapped.getOrderFor("alternative")).isNull(); } - @SuppressWarnings("unchecked") private BoundCondition map(Criteria criteria) { BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1); diff --git a/src/test/java/org/springframework/data/r2dbc/function/query/UpdateMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/function/query/UpdateMapperUnitTests.java index 9c23930..83c5e4f 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/query/UpdateMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/query/UpdateMapperUnitTests.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.stream.Collectors; import org.junit.Test; - import org.springframework.data.r2dbc.dialect.BindMarkersFactory; import org.springframework.data.r2dbc.domain.BindTarget; import org.springframework.data.r2dbc.domain.SettableValue; @@ -89,7 +88,6 @@ public class UpdateMapperUnitTests { verifyZeroInteractions(bindTarget); } - @SuppressWarnings("unchecked") private BoundAssignments map(Update update) { BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1);