From b0d5516b03203713c77a566a3d62141623204201 Mon Sep 17 00:00:00 2001 From: coach88 Date: Fri, 7 Aug 2015 10:46:27 +0300 Subject: [PATCH 1/6] Queries in Spring Data MongoDB --- spring-data-mongodb/pom.xml | 7 + .../baeldung/event/BeforeConvertListener.java | 12 ++ .../main/java/org/baeldung/model/QUser.java | 20 +++ .../baeldung/repository/UserRepository.java | 15 +- .../src/main/resources/mongoConfig.xml | 6 +- .../MongoTemplateQueryIntegrationTest.java | 131 ++++++++++++++++++ .../MongoRepositoryQueryIntegrationTest.java | 116 ++++++++++++++++ 7 files changed, 304 insertions(+), 3 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java create mode 100644 spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java create mode 100644 spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java create mode 100644 spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 539e4136e4a8..049af4738f6f 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -66,6 +66,12 @@ ${org.slf4j.version} + + com.mysema.querydsl + querydsl-mongodb + ${querydsl.version} + + @@ -89,6 +95,7 @@ 1.3 4.11 2.4.1 + 3.6.6 1.7.12 1.1.3 diff --git a/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java b/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java new file mode 100644 index 000000000000..3e8cde0aeb2e --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java @@ -0,0 +1,12 @@ +package org.baeldung.event; + +import org.baeldung.model.User; +import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; + +public class BeforeConvertListener extends AbstractMongoEventListener { + + @Override + public void onBeforeConvert(User user) { + System.out.println("stop"); + } +} diff --git a/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java b/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java new file mode 100644 index 000000000000..9d60457033a0 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java @@ -0,0 +1,20 @@ +package org.baeldung.model; + +import javax.annotation.Generated; + +import com.mysema.query.types.path.EntityPathBase; +import com.mysema.query.types.path.StringPath; + +@Generated("com.mysema.query.codegen.EntitySerializer") +public class QUser extends EntityPathBase { + + private static final long serialVersionUID = 1L; + + public static final QUser user = new QUser("user"); + + public final StringPath name = createString("name"); + + public QUser(String variable) { + super(User.class, variable); + } +} diff --git a/spring-data-mongodb/src/main/java/org/baeldung/repository/UserRepository.java b/spring-data-mongodb/src/main/java/org/baeldung/repository/UserRepository.java index 3625e1d1de32..3af6ed4cec3c 100644 --- a/spring-data-mongodb/src/main/java/org/baeldung/repository/UserRepository.java +++ b/spring-data-mongodb/src/main/java/org/baeldung/repository/UserRepository.java @@ -1,8 +1,19 @@ package org.baeldung.repository; +import java.util.List; + import org.baeldung.model.User; + import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.data.querydsl.QueryDslPredicateExecutor; + +public interface UserRepository extends MongoRepository, QueryDslPredicateExecutor { + @Query("{ 'name' : ?0 }") + List findUsersByName(String name); + + @Query(value = "{'age':?0}", fields = "{ 'name' : 1}") + List findUsersByAgeAndReturnNames(int age); -public interface UserRepository extends MongoRepository { - // + List findByAgeBetween(int ageGT, int ageLT); } diff --git a/spring-data-mongodb/src/main/resources/mongoConfig.xml b/spring-data-mongodb/src/main/resources/mongoConfig.xml index 361c483e6089..1bda9d030337 100644 --- a/spring-data-mongodb/src/main/resources/mongoConfig.xml +++ b/spring-data-mongodb/src/main/resources/mongoConfig.xml @@ -9,7 +9,8 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd" > - + + @@ -22,5 +23,8 @@ + + + \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java new file mode 100644 index 000000000000..2a8a2fd71b75 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java @@ -0,0 +1,131 @@ +package org.baeldung.mongotemplate; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.util.List; + +import org.baeldung.config.MongoConfig; +import org.baeldung.model.User; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoConfig.class) +public class MongoTemplateQueryIntegrationTest { + + @Autowired + private MongoTemplate mongoTemplate; + + @Before + public void testSetup() { + mongoTemplate.createCollection(User.class); + } + + @After + public void tearDown() { + mongoTemplate.dropCollection(User.class); + } + + @Test + public void givenUsersExist_whenFindingUserWithAgeLessThan50AndGreateThan20_thenUsersAreFound() { + User user = new User(); + user.setName("Eric"); + user.setAge(45); + mongoTemplate.insert(user); + user = new User(); + user.setName("Antony"); + user.setAge(55); + mongoTemplate.insert(user); + + Query query = new Query(); + query.addCriteria(Criteria.where("age").lt(50).gt(20)); + List users = mongoTemplate.find(query, User.class); + + assertThat(users.size(), is(1)); + } + + @Test + public void givenUsersExist_whenFindingUserWithNameStartWithA_thenUsersAreFound() { + User user = new User(); + user.setName("Eric"); + user.setAge(45); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Antony"); + user.setAge(33); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Alice"); + user.setAge(35); + mongoTemplate.insert(user); + + Query query = new Query(); + query.addCriteria(Criteria.where("name").regex("^A")); + + List users = mongoTemplate.find(query, User.class); + assertThat(users.size(), is(2)); + } + + @Test + public void givenUsersExist_whenFindingByPage_thenUsersAreFoundByPage() { + User user = new User(); + user.setName("Eric"); + user.setAge(45); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Antony"); + user.setAge(33); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Alice"); + user.setAge(35); + mongoTemplate.insert(user); + + final Pageable pageableRequest = new PageRequest(0, 2); + Query query = new Query(); + query.with(pageableRequest); + + List users = mongoTemplate.find(query, User.class); + assertThat(users.size(), is(2)); + } + + @Test + public void givenUsersExist_whenFindingUsersAndSortThem_thenUsersAreFoundAndSorted() { + User user = new User(); + user.setName("Eric"); + user.setAge(45); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Antony"); + user.setAge(33); + mongoTemplate.insert(user); + + user = new User(); + user.setName("Alice"); + user.setAge(35); + mongoTemplate.insert(user); + + Query query = new Query(); + query.with(new Sort(Sort.Direction.ASC, "age")); + + List users = mongoTemplate.find(query, User.class); + assertThat(users.size(), is(3)); + } +} diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java new file mode 100644 index 000000000000..4a741c49a723 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java @@ -0,0 +1,116 @@ +package org.baeldung.repository; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.util.List; + +import org.baeldung.config.MongoConfig; +import org.baeldung.model.QUser; +import org.baeldung.model.User; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.mysema.query.types.Predicate; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoConfig.class) +public class MongoRepositoryQueryIntegrationTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private MongoOperations mongoOps; + + @Before + public void testSetup() { + mongoOps.createCollection(User.class); + } + + @After + public void tearDown() { + mongoOps.dropCollection(User.class); + } + + @Test + public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() { + User user = new User(); + user.setName("Jon"); + mongoOps.insert(user); + + user = new User(); + user.setName("Jon"); + mongoOps.insert(user); + + user = new User(); + user.setName("Jim"); + mongoOps.insert(user); + + List users = userRepository.findUsersByName("Jon"); + assertThat(users.size(), is(2)); + } + + @Test + public void givenUsersExist_whenFindingUsersByAgeAndReturningNames_thenUsersAreFoundAndReturnedNames() { + User user = new User(); + user.setName("Jon"); + user.setAge(20); + mongoOps.insert(user); + + user = new User(); + user.setName("Jon"); + user.setAge(30); + mongoOps.insert(user); + + user = new User(); + user.setName("Jim"); + user.setAge(40); + mongoOps.insert(user); + + List users = userRepository.findUsersByAgeAndReturnNames(30); + assertThat(users.size(), is(1)); + } + + @Test + public void givenUsersExist_whenFindingUsersWithAgeCreaterThanAndLessThan_thenUsersAreFound() { + User user = new User(); + user.setAge(20); + user.setName("Jon"); + mongoOps.insert(user); + + user = new User(); + user.setAge(50); + user.setName("Jon"); + mongoOps.insert(user); + + user = new User(); + user.setAge(33); + user.setName("Jim"); + mongoOps.insert(user); + + List users = userRepository.findByAgeBetween(26, 40); + assertThat(users.size(), is(1)); + } + + @Test + public void givenUsersExist_whenFindingUsersAndCount_thenUserAreFound() { + User user = new User(); + user.setName("Alexey"); + mongoOps.insert(user); + + QUser qUser = new QUser("user"); + + Predicate predicate = qUser.name.eq("Alexey"); + List users = (List) userRepository.findAll(predicate); + + assertThat(users.size(), is(1)); + } + +} From 686769e99dee31079d762f930a8505ca7e1c1fd1 Mon Sep 17 00:00:00 2001 From: coach88 Date: Fri, 7 Aug 2015 10:48:59 +0300 Subject: [PATCH 2/6] Removed unused file. --- .../org/baeldung/event/BeforeConvertListener.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java diff --git a/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java b/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java deleted file mode 100644 index 3e8cde0aeb2e..000000000000 --- a/spring-data-mongodb/src/main/java/org/baeldung/event/BeforeConvertListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.baeldung.event; - -import org.baeldung.model.User; -import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; - -public class BeforeConvertListener extends AbstractMongoEventListener { - - @Override - public void onBeforeConvert(User user) { - System.out.println("stop"); - } -} From 56cba00c7daec96490630eb45d7f0be53503000f Mon Sep 17 00:00:00 2001 From: coach88 Date: Fri, 7 Aug 2015 13:45:11 +0300 Subject: [PATCH 3/6] Added support auto generating Q classes for QueryDSL --- spring-data-mongodb/pom.xml | 25 ++++++++++++++----- .../main/java/org/baeldung/model/QUser.java | 20 --------------- .../main/java/org/baeldung/model/User.java | 3 +++ 3 files changed, 22 insertions(+), 26 deletions(-) delete mode 100644 spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 049af4738f6f..3111e5133139 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -71,18 +71,31 @@ querydsl-mongodb ${querydsl.version} + + com.mysema.querydsl + querydsl-apt + 3.6.6 + - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - + com.mysema.maven + apt-maven-plugin + 1.1.3 + + + + process + + + target/generated-sources/java + org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor + + + diff --git a/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java b/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java deleted file mode 100644 index 9d60457033a0..000000000000 --- a/spring-data-mongodb/src/main/java/org/baeldung/model/QUser.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.baeldung.model; - -import javax.annotation.Generated; - -import com.mysema.query.types.path.EntityPathBase; -import com.mysema.query.types.path.StringPath; - -@Generated("com.mysema.query.codegen.EntitySerializer") -public class QUser extends EntityPathBase { - - private static final long serialVersionUID = 1L; - - public static final QUser user = new QUser("user"); - - public final StringPath name = createString("name"); - - public QUser(String variable) { - super(User.class, variable); - } -} diff --git a/spring-data-mongodb/src/main/java/org/baeldung/model/User.java b/spring-data-mongodb/src/main/java/org/baeldung/model/User.java index 7e074c1d2b6a..34156163fc4d 100644 --- a/spring-data-mongodb/src/main/java/org/baeldung/model/User.java +++ b/spring-data-mongodb/src/main/java/org/baeldung/model/User.java @@ -3,6 +3,9 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import com.mysema.query.annotations.QueryEntity; + +@QueryEntity @Document public class User { From 217bc2707f4a660e39e0e8e2c2f4baec23a75bc3 Mon Sep 17 00:00:00 2001 From: coach88 Date: Fri, 7 Aug 2015 21:57:09 +0300 Subject: [PATCH 4/6] Minor cleanup in pom.xml --- spring-data-mongodb/pom.xml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 3111e5133139..798fc2b2ddaf 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -74,7 +74,7 @@ com.mysema.querydsl querydsl-apt - 3.6.6 + ${querydsl.version} @@ -84,7 +84,7 @@ com.mysema.maven apt-maven-plugin - 1.1.3 + ${mysema.maven.version} @@ -97,6 +97,14 @@ + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + @@ -109,6 +117,7 @@ 4.11 2.4.1 3.6.6 + 1.1.3 1.7.12 1.1.3 From d63b7e8cab06f0548a9f486568aa19bc4ced74b9 Mon Sep 17 00:00:00 2001 From: coach88 Date: Sat, 8 Aug 2015 11:23:12 +0300 Subject: [PATCH 5/6] Minor cleanup with tests and infrastructure --- spring-data-mongodb/.classpath | 58 +++++++++++-------- spring-data-mongodb/.project | 37 +++++------- .../MongoRepositoryQueryIntegrationTest.java | 8 ++- 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/spring-data-mongodb/.classpath b/spring-data-mongodb/.classpath index 8df09bc8588b..b049bd7d47c9 100644 --- a/spring-data-mongodb/.classpath +++ b/spring-data-mongodb/.classpath @@ -1,27 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-mongodb/.project b/spring-data-mongodb/.project index ad5b57cb82d8..7a469b9f7a2c 100644 --- a/spring-data-mongodb/.project +++ b/spring-data-mongodb/.project @@ -1,23 +1,18 @@ - spring-data-mongodb - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - + spring-data-mongodb + NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. + + + + org.eclipse.jdt.core.javabuilder + + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java index 4a741c49a723..b58981a840d1 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/MongoRepositoryQueryIntegrationTest.java @@ -102,12 +102,16 @@ public void givenUsersExist_whenFindingUsersWithAgeCreaterThanAndLessThan_thenUs @Test public void givenUsersExist_whenFindingUsersAndCount_thenUserAreFound() { User user = new User(); - user.setName("Alexey"); + user.setName("Alex"); + mongoOps.insert(user); + + user = new User(); + user.setName("Mat"); mongoOps.insert(user); QUser qUser = new QUser("user"); - Predicate predicate = qUser.name.eq("Alexey"); + Predicate predicate = qUser.name.eq("Alex"); List users = (List) userRepository.findAll(predicate); assertThat(users.size(), is(1)); From cf52efcc5bf0a38566ede3bfd8a455fffbb08218 Mon Sep 17 00:00:00 2001 From: coach88 Date: Sat, 8 Aug 2015 13:11:11 +0300 Subject: [PATCH 6/6] Updated dependencies in pom and minor formatting cleanup --- spring-data-mongodb/pom.xml | 8 +++++++- .../src/main/java/org/baeldung/model/User.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 798fc2b2ddaf..34ec7f094971 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -14,6 +14,12 @@ spring-data-mongodb ${org.springframework.data.version} + + + org.springframework + spring-core + ${org.springframework.version} + junit @@ -112,7 +118,7 @@ UTF-8 1.7.1.RELEASE - 4.1.7.RELEASE + 4.2.0.RELEASE 1.3 4.11 2.4.1 diff --git a/spring-data-mongodb/src/main/java/org/baeldung/model/User.java b/spring-data-mongodb/src/main/java/org/baeldung/model/User.java index 34156163fc4d..8cf516762d42 100644 --- a/spring-data-mongodb/src/main/java/org/baeldung/model/User.java +++ b/spring-data-mongodb/src/main/java/org/baeldung/model/User.java @@ -5,7 +5,7 @@ import com.mysema.query.annotations.QueryEntity; -@QueryEntity +@QueryEntity @Document public class User {