diff --git a/pom.xml b/pom.xml index eea61f492c..a36ba4cbb1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT pom Spring Data MongoDB @@ -28,7 +28,7 @@ multi spring-data-mongodb - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATACMNS-1059-SNAPSHOT 3.4.2 1.3.0 diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 4a49168713..ece205ee55 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 750ed23aa8..b4a42d5637 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index 50d0a6454a..b87b3630e6 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 886bcca7b6..8d35d6da16 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.DATAMONGO-1690-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java index 480f65c254..53fb544bbd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java @@ -106,7 +106,7 @@ protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { return SimpleReactiveMongoRepository.class; } - return isQueryDslRepository ? QueryDslMongoRepository.class : SimpleMongoRepository.class; + return isQueryDslRepository ? QuerydslMongoRepository.class : SimpleMongoRepository.class; } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslMongoRepository.java similarity index 91% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslMongoRepository.java index 1cc997eccf..a11667e5df 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslMongoRepository.java @@ -17,7 +17,9 @@ import java.io.Serializable; import java.util.List; +import java.util.Optional; +import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -34,6 +36,7 @@ import org.springframework.data.repository.support.PageableExecutionUtils; import org.springframework.util.Assert; +import com.querydsl.core.NonUniqueResultException; import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.OrderSpecifier; @@ -42,13 +45,14 @@ import com.querydsl.mongodb.AbstractMongodbQuery; /** - * Special QueryDsl based repository implementation that allows execution {@link Predicate}s in various forms. - * + * Special Querydsl based repository implementation that allows execution {@link Predicate}s in various forms. + * * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch + * @author Christoph Strobl */ -public class QueryDslMongoRepository extends SimpleMongoRepository +public class QuerydslMongoRepository extends SimpleMongoRepository implements QuerydslPredicateExecutor { private final PathBuilder builder; @@ -56,25 +60,25 @@ public class QueryDslMongoRepository extends SimpleM private final MongoOperations mongoOperations; /** - * Creates a new {@link QueryDslMongoRepository} for the given {@link EntityMetadata} and {@link MongoTemplate}. Uses + * Creates a new {@link QuerydslMongoRepository} for the given {@link EntityMetadata} and {@link MongoTemplate}. Uses * the {@link SimpleEntityPathResolver} to create an {@link EntityPath} for the given domain class. - * + * * @param entityInformation must not be {@literal null}. * @param mongoOperations must not be {@literal null}. */ - public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations) { + public QuerydslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations) { this(entityInformation, mongoOperations, SimpleEntityPathResolver.INSTANCE); } /** - * Creates a new {@link QueryDslMongoRepository} for the given {@link MongoEntityInformation}, {@link MongoTemplate} + * Creates a new {@link QuerydslMongoRepository} for the given {@link MongoEntityInformation}, {@link MongoTemplate} * and {@link EntityPathResolver}. - * + * * @param entityInformation must not be {@literal null}. * @param mongoOperations must not be {@literal null}. * @param resolver must not be {@literal null}. */ - public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations, + public QuerydslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations, EntityPathResolver resolver) { super(entityInformation, mongoOperations); @@ -93,11 +97,15 @@ public QueryDslMongoRepository(MongoEntityInformation entityInformation, * @see org.springframework.data.querydsl.QuerydslPredicateExecutor#findById(com.querydsl.core.types.Predicate) */ @Override - public T findOne(Predicate predicate) { + public Optional findOne(Predicate predicate) { Assert.notNull(predicate, "Predicate must not be null!"); - return createQueryFor(predicate).fetchOne(); + try { + return Optional.ofNullable(createQueryFor(predicate).fetchOne()); + } catch (NonUniqueResultException ex) { + throw new IncorrectResultSizeDataAccessException(ex.getMessage(), 1, ex); + } } /* @@ -219,7 +227,7 @@ public boolean exists(Predicate predicate) { /** * Creates a {@link MongodbQuery} for the given {@link Predicate}. - * + * * @param predicate * @return */ @@ -238,7 +246,7 @@ private AbstractMongodbQuery> createQuery() { /** * Applies the given {@link Pageable} to the given {@link MongodbQuery}. - * + * * @param query * @param pageable * @return @@ -252,7 +260,7 @@ private AbstractMongodbQuery> applyPagination( /** * Applies the given {@link Sort} to the given {@link MongodbQuery}. - * + * * @param query * @param sort * @return @@ -276,7 +284,7 @@ private AbstractMongodbQuery> applySorting( /** * Transforms a plain {@link Order} into a QueryDsl specific {@link OrderSpecifier}. - * + * * @param order * @return */ 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 42a64c7509..fd5f9bf1fe 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 @@ -917,7 +917,7 @@ public void shouldExecuteFindOnDbRefCorrectly() { dave.setCreator(user); operations.save(dave); - assertThat(repository.findOne(QPerson.person.creator.eq(user)), is(dave)); + assertThat(repository.findOne(QPerson.person.creator.eq(user)).get(), is(dave)); } @Test // DATAMONGO-969 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java index f06034fda1..ccf562b6c5 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java @@ -15,8 +15,7 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.*; import java.util.Arrays; import java.util.List; @@ -25,6 +24,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.MongoOperations; @@ -35,10 +35,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * Integration test for {@link QueryDslMongoRepository}. + * Integration test for {@link QuerydslMongoRepository}. * * @author Thomas Darimont * @author Mark Paluch + * @author Christoph Strobl */ @ContextConfiguration( locations = "/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml") @@ -46,7 +47,7 @@ public class QueryDslMongoRepositoryIntegrationTests { @Autowired MongoOperations operations; - QueryDslMongoRepository repository; + QuerydslMongoRepository repository; Person dave, oliver, carter; QPerson person; @@ -56,7 +57,7 @@ public void setup() { MongoRepositoryFactory factory = new MongoRepositoryFactory(operations); MongoEntityInformation entityInformation = factory.getEntityInformation(Person.class); - repository = new QueryDslMongoRepository(entityInformation, operations); + repository = new QuerydslMongoRepository<>(entityInformation, operations); operations.dropCollection(Person.class); @@ -72,8 +73,8 @@ public void setup() { @Test // DATAMONGO-1146 public void shouldSupportExistsWithPredicate() throws Exception { - assertThat(repository.exists(person.firstname.eq("Dave")), is(true)); - assertThat(repository.exists(person.firstname.eq("Unknown")), is(false)); + assertThat(repository.exists(person.firstname.eq("Dave"))).isTrue(); + assertThat(repository.exists(person.firstname.eq("Unknown"))).isFalse(); } @Test // DATAMONGO-1167 @@ -81,9 +82,21 @@ public void shouldSupportFindAllWithPredicateAndSort() { List users = repository.findAll(person.lastname.isNotNull(), Sort.by(Direction.ASC, "firstname")); - assertThat(users, hasSize(3)); - assertThat(users.get(0).getFirstname(), is(carter.getFirstname())); - assertThat(users.get(2).getFirstname(), is(oliver.getFirstname())); - assertThat(users, hasItems(carter, dave, oliver)); + assertThat(users).containsExactly(carter, dave, oliver); + } + + @Test // DATAMONGO-1690 + public void findOneWithPredicateReturnsResultCorrectly() { + assertThat(repository.findOne(person.firstname.eq(dave.getFirstname()))).contains(dave); + } + + @Test // DATAMONGO-1690 + public void findOneWithPredicateReturnsOptionalEmptyWhenNoDataFound() { + assertThat(repository.findOne(person.firstname.eq("batman"))).isNotPresent(); + } + + @Test(expected = IncorrectResultSizeDataAccessException.class) // DATAMONGO-1690 + public void findOneWithPredicateThrowsExceptionForNonUniqueResults() { + repository.findOne(person.firstname.contains("e")); } }