diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java index 5566f4a4c..fbe1c0fb9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java @@ -16,6 +16,7 @@ package org.springframework.data.mongodb.core.query; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -35,6 +36,7 @@ import org.springframework.util.ObjectUtils; * @author Christoph Strobl * @author Mark Paluch * @author Owen Q + * @author Kirill Egorov */ public class Field { @@ -124,6 +126,17 @@ public class Field { */ public Field include(String... fields) { + return include(Arrays.asList(fields)); + } + + /** + * Include one or more {@code fields} to be returned by the query operation. + * + * @param fields the document field names to be included. + * @return {@code this} field projection instance. + */ + public Field include(Collection fields) { + Assert.notNull(fields, "Keys must not be null"); for (String key : fields) { @@ -136,7 +149,7 @@ public class Field { /** * Exclude a single {@code field} from being returned by the query operation. * - * @param field the document field name to be included. + * @param field the document field name to be excluded. * @return {@code this} field projection instance. */ public Field exclude(String field) { @@ -151,12 +164,23 @@ public class Field { /** * Exclude one or more {@code fields} from being returned by the query operation. * - * @param fields the document field names to be included. + * @param fields the document field names to be excluded. * @return {@code this} field projection instance. * @since 3.1 */ public Field exclude(String... fields) { + return exclude(Arrays.asList(fields)); + } + + /** + * Exclude one or more {@code fields} from being returned by the query operation. + * + * @param fields the document field names to be excluded. + * @return {@code this} field projection instance. + */ + public Field exclude(Collection fields) { + Assert.notNull(fields, "Keys must not be null"); for (String key : fields) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java index 451d4a4c0..e6a23199d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java @@ -60,6 +60,7 @@ import com.mongodb.client.result.DeleteResult; * @author Mark Paluch * @author Mehran Behnam * @author Jens Schauder + * @author Kirill Egorov */ public class SimpleMongoRepository implements MongoRepository { @@ -485,7 +486,7 @@ public class SimpleMongoRepository implements MongoRepository { query.limit(getLimit()); if (!getFieldsToInclude().isEmpty()) { - query.fields().include(getFieldsToInclude().toArray(new String[0])); + query.fields().include(getFieldsToInclude()); } getReadPreference().ifPresent(query::withReadPreference); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java index bb110c9d7..41f9210b3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java @@ -63,6 +63,7 @@ import com.mongodb.client.result.DeleteResult; * @author Ruben J Garcia * @author Jens Schauder * @author Clément Petit + * @author Kirill Egorov * @since 2.0 */ public class SimpleReactiveMongoRepository implements ReactiveMongoRepository { @@ -555,7 +556,7 @@ public class SimpleReactiveMongoRepository implement query.limit(getLimit()); if (!getFieldsToInclude().isEmpty()) { - query.fields().include(getFieldsToInclude().toArray(new String[0])); + query.fields().include(getFieldsToInclude()); } readPreference.ifPresent(query::withReadPreference); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java index b93fd1b2f..6dba758d8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java @@ -19,12 +19,15 @@ import static org.springframework.data.mongodb.test.util.Assertions.*; import org.junit.jupiter.api.Test; +import java.util.List; + /** * Unit tests for {@link Field}. * * @author Oliver Gierke * @author Owen Q * @author Mark Paluch + * @author Kirill Egorov */ class FieldUnitTests { @@ -64,4 +67,22 @@ class FieldUnitTests { assertThat(fields.getFieldsObject()).isEqualTo("{foo:0, bar:0, baz:0}"); } + + @Test // GH-4625 + void overriddenInclusionMethodsCreateEqualFields() { + + Field left = new Field().include("foo", "bar"); + Field right = new Field().include(List.of("foo", "bar")); + + assertThat(left).isEqualTo(right); + } + + @Test // GH-4625 + void overriddenExclusionMethodsCreateEqualFields() { + + Field left = new Field().exclude("foo", "bar"); + Field right = new Field().exclude(List.of("foo", "bar")); + + assertThat(left).isEqualTo(right); + } }