diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 00a78f1b7..2fcabf78c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -919,7 +919,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return getPotentiallyConvertedSimpleWrite(obj); } - TypeInformation typeHint = typeInformation == null ? null : ClassTypeInformation.OBJECT; + TypeInformation typeHint = typeInformation == null ? ClassTypeInformation.OBJECT : typeInformation; if (obj instanceof BasicDBList) { return maybeConvertList((BasicDBList) obj, typeHint); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 1237573ae..283e98772 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -306,7 +306,7 @@ public class QueryMapper { * @return the converted mongo type or null if source is null */ protected Object delegateConvertToMongoType(Object source, MongoPersistentEntity entity) { - return converter.convertToMongoType(source); + return converter.convertToMongoType(source, entity == null ? null : entity.getTypeInformation()); } protected Object convertAssociation(Object source, Field field) { @@ -611,6 +611,21 @@ public class QueryMapper { */ public MetadataBackedField(String name, MongoPersistentEntity entity, MappingContext, MongoPersistentProperty> context) { + this(name, entity, context, null); + } + + /** + * Creates a new {@link MetadataBackedField} with the given name, {@link MongoPersistentEntity} and + * {@link MappingContext} with the given {@link MongoPersistentProperty}. + * + * @param name must not be {@literal null} or empty. + * @param entity must not be {@literal null}. + * @param context must not be {@literal null}. + * @param property may be {@literal null}. + */ + public MetadataBackedField(String name, MongoPersistentEntity entity, + MappingContext, MongoPersistentProperty> context, + MongoPersistentProperty property) { super(name); @@ -620,7 +635,7 @@ public class QueryMapper { this.mappingContext = context; this.path = getPath(name); - this.property = path == null ? null : path.getLeafProperty(); + this.property = path == null ? property : path.getLeafProperty(); this.association = findAssociation(); } @@ -630,7 +645,7 @@ public class QueryMapper { */ @Override public MetadataBackedField with(String name) { - return new MetadataBackedField(name, entity, mappingContext); + return new MetadataBackedField(name, entity, mappingContext, property); } /* diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index da18bb430..f4218a274 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -1398,6 +1398,7 @@ public class MappingMongoConverterUnitTests { /** * @see DATAMONGO-812 + * @see DATAMONGO-893 */ @Test public void convertsListToBasicDBListAndRetainsTypeInformationForComplexObjects() { @@ -1407,7 +1408,7 @@ public class MappingMongoConverterUnitTests { address.street = "Foo"; Object result = converter.convertToMongoType(Collections.singletonList(address), - ClassTypeInformation.from(Address.class)); + ClassTypeInformation.from(InterfaceType.class)); assertThat(result, is(instanceOf(BasicDBList.class))); @@ -1833,7 +1834,11 @@ public class MappingMongoConverterUnitTests { abstract void method(); } - static class Address { + static interface InterfaceType { + + } + + static class Address implements InterfaceType { String street; String city; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index c30707fac..e424f7b89 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -39,6 +39,7 @@ import org.springframework.data.mongodb.core.DBObjectTestUtils; import org.springframework.data.mongodb.core.Person; import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; @@ -568,10 +569,42 @@ public class QueryMapperUnitTests { assertThat(mappedFields, is(notNullValue())); } + /** + * @see DATAMONGO-893 + */ + @Test + public void classInformationShouldNotBePresentInDBObjectUsedInFinderMethods() { + + EmbeddedClass embedded = new EmbeddedClass(); + embedded.id = "1"; + + EmbeddedClass embedded2 = new EmbeddedClass(); + embedded2.id = "2"; + Query query = query(where("embedded").in(Arrays.asList(embedded, embedded2))); + + DBObject dbo = mapper.getMappedObject(query.getQueryObject(), context.getPersistentEntity(Foo.class)); + assertThat(dbo.toString(), equalTo("{ \"embedded\" : { \"$in\" : [ { \"_id\" : \"1\"} , { \"_id\" : \"2\"}]}}")); + } + + @Document + public class Foo { + @Id private ObjectId id; + EmbeddedClass embedded; + } + + public class EmbeddedClass { + public String id; + } + class IdWrapper { Object id; } + class ClassWithEmbedded { + @Id String id; + Sample sample; + } + class ClassWithDefaultId { String id; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 9dc4f4f72..e902c3859 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -863,4 +863,21 @@ public abstract class AbstractPersonRepositoryIntegrationTests { public void deleteByUsingAnnotatedQueryShouldReturnNumberOfDocumentsRemovedIfReturnTypeIsLong() { assertThat(repository.removePersonByLastnameUsingAnnotatedQuery("Beauford"), is(1L)); } + + /** + * @see DATAMONGO-893 + */ + @Test + public void findByNestedPropertyInCollectionShouldFindMatchingDocuments() { + + Person p = new Person("Mary", "Poppins"); + Address adr = new Address("some", "2", "where"); + p.setAddress(adr); + + repository.save(p); + + Page result = repository.findByAddressIn(Arrays.asList(adr), new PageRequest(0, 10)); + + assertThat(result.getContent(), hasSize(1)); + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index 52aade2f0..4f37497f1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -286,4 +286,8 @@ public interface PersonRepository extends MongoRepository, Query @Query(value = "{ 'lastname' : ?0 }", delete = true) Long removePersonByLastnameUsingAnnotatedQuery(String lastname); + /** + * @see DATAMONGO-893 + */ + Page findByAddressIn(List
address, Pageable page); }