DATAMONGO-2374 - Fix simple type result handling for repository query methods.

Original pull request: #791.
This commit is contained in:
Christoph Strobl
2019-09-19 08:58:48 +02:00
committed by Mark Paluch
parent 686cdac73f
commit bc29f2b24e
5 changed files with 33 additions and 2 deletions

View File

@@ -66,8 +66,12 @@ class PropertyOperations {
projectionInformation.getInputProperties().forEach(it -> projectedFields.append(it.getName(), 1));
}
} else {
mappingContext.getRequiredPersistentEntity(targetType).doWithProperties(
(SimplePropertyHandler) persistentProperty -> projectedFields.append(persistentProperty.getName(), 1));
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(targetType);
if(entity != null) {
entity.doWithProperties(
(SimplePropertyHandler) persistentProperty -> projectedFields.append(persistentProperty.getName(), 1));
}
}
return projectedFields;

View File

@@ -174,6 +174,10 @@ interface ReactiveMongoQueryExecution {
return source;
}
if(!operations.getConverter().getMappingContext().hasPersistentEntityFor(returnedType.getReturnedType())) {
return source;
}
Converter<Object, Object> converter = new DtoInstantiatingConverter(returnedType.getReturnedType(),
operations.getConverter().getMappingContext(), instantiators);

View File

@@ -1302,4 +1302,11 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
// assertThat(target).isNotNull();
// assertThat(target.getShippingAddresses()).hasSize(1);
}
@Test // DATAMONGO-2374
public void findsWithNativeProjection() {
assertThat(repository.findDocumentById(dave.getId()).get()).containsEntry("firstname", dave.getFirstname())
.containsEntry("lastname", dave.getLastname());
}
}

View File

@@ -362,4 +362,7 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
@Query(value = "{ 'shippingAddresses' : { '$elemMatch' : { 'city' : { '$eq' : 'lnz' } } } }", fields = "{ 'shippingAddresses.$': ?0 }")
Person findWithArrayPositionInProjection(int position);
@Query(value="{_id:?0}")
Optional<org.bson.Document> findDocumentById(String id);
}

View File

@@ -384,6 +384,16 @@ public class ReactiveMongoRepositoryTests implements BeanClassLoaderAware, BeanF
.verifyComplete();
}
@Test // DATAMONGO-2374
public void findsWithNativeProjection() {
repository.findDocumentById(dave.getId()) //
.as(StepVerifier::create) //
.consumeNextWith(it -> {
assertThat(it).containsEntry("firstname", dave.getFirstname()).containsEntry("lastname", dave.getLastname());
}).verifyComplete();
}
interface ReactivePersonRepository extends ReactiveMongoRepository<Person, String> {
Flux<Person> findByLastname(String lastname);
@@ -422,6 +432,9 @@ public class ReactiveMongoRepositoryTests implements BeanClassLoaderAware, BeanF
@Query(sort = "{ age : -1 }")
Flux<Person> findByAgeGreaterThan(int age, Sort sort);
@Query(value = "{_id:?0}")
Mono<org.bson.Document> findDocumentById(String id);
}
interface ReactiveContactRepository extends ReactiveMongoRepository<Contact, String> {}