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"));
}
}