From b0d5516b03203713c77a566a3d62141623204201 Mon Sep 17 00:00:00 2001 From: coach88 Date: Fri, 7 Aug 2015 10:46:27 +0300 Subject: [PATCH] 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 | 19 ++- .../src/main/resources/mongoConfig.xml | 6 +- .../MongoTemplateQueryIntegrationTest.java | 131 ++++++++++++++++++ .../MongoRepositoryQueryIntegrationTest.java | 116 ++++++++++++++++ 7 files changed, 306 insertions(+), 5 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 539e4136e4..049af4738f 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 0000000000..3e8cde0aeb --- /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 0000000000..9d60457033 --- /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 3625e1d1de..3af6ed4cec 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 org.baeldung.model.User; -import org.springframework.data.mongodb.repository.MongoRepository; +import java.util.List; -public interface UserRepository extends MongoRepository { - // +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); + + 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 361c483e60..1bda9d0303 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 0000000000..2a8a2fd71b --- /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 0000000000..4a741c49a7 --- /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)); + } + +}