Skip to content

Commit b0d5516

Browse files
committed
Queries in Spring Data MongoDB
1 parent 00eb2fd commit b0d5516

File tree

7 files changed

+304
-3
lines changed

7 files changed

+304
-3
lines changed

spring-data-mongodb/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@
6666
<version>${org.slf4j.version}</version>
6767
</dependency>
6868

69+
<dependency>
70+
<groupId>com.mysema.querydsl</groupId>
71+
<artifactId>querydsl-mongodb</artifactId>
72+
<version>${querydsl.version}</version>
73+
</dependency>
74+
6975
</dependencies>
7076

7177
<build>
@@ -89,6 +95,7 @@
8995
<org.hamcrest.version>1.3</org.hamcrest.version>
9096
<junit.version>4.11</junit.version>
9197
<rest-assured.version>2.4.1</rest-assured.version>
98+
<querydsl.version>3.6.6</querydsl.version>
9299

93100
<org.slf4j.version>1.7.12</org.slf4j.version>
94101
<logback.version>1.1.3</logback.version>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.baeldung.event;
2+
3+
import org.baeldung.model.User;
4+
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
5+
6+
public class BeforeConvertListener extends AbstractMongoEventListener<User> {
7+
8+
@Override
9+
public void onBeforeConvert(User user) {
10+
System.out.println("stop");
11+
}
12+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.baeldung.model;
2+
3+
import javax.annotation.Generated;
4+
5+
import com.mysema.query.types.path.EntityPathBase;
6+
import com.mysema.query.types.path.StringPath;
7+
8+
@Generated("com.mysema.query.codegen.EntitySerializer")
9+
public class QUser extends EntityPathBase<User> {
10+
11+
private static final long serialVersionUID = 1L;
12+
13+
public static final QUser user = new QUser("user");
14+
15+
public final StringPath name = createString("name");
16+
17+
public QUser(String variable) {
18+
super(User.class, variable);
19+
}
20+
}
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
package org.baeldung.repository;
22

3+
import java.util.List;
4+
35
import org.baeldung.model.User;
6+
47
import org.springframework.data.mongodb.repository.MongoRepository;
8+
import org.springframework.data.mongodb.repository.Query;
9+
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
10+
11+
public interface UserRepository extends MongoRepository<User, String>, QueryDslPredicateExecutor<User> {
12+
@Query("{ 'name' : ?0 }")
13+
List<User> findUsersByName(String name);
14+
15+
@Query(value = "{'age':?0}", fields = "{ 'name' : 1}")
16+
List<String> findUsersByAgeAndReturnNames(int age);
517

6-
public interface UserRepository extends MongoRepository<User, String> {
7-
//
18+
List<User> findByAgeBetween(int ageGT, int ageLT);
819
}

spring-data-mongodb/src/main/resources/mongoConfig.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
http://www.springframework.org/schema/context
1010
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
1111
>
12-
12+
<context:annotation-config/>
13+
1314
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
1415
<property name="host" value="localhost"/>
1516
</bean>
@@ -22,5 +23,8 @@
2223
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
2324

2425
<mongo:repositories base-package="org.baeldung.repository" mongo-template-ref="mongoTemplate"/>
26+
27+
<bean class="org.baeldung.event.BeforeConvertListener">
28+
</bean>
2529

2630
</beans>
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package org.baeldung.mongotemplate;
2+
3+
import static org.hamcrest.CoreMatchers.is;
4+
import static org.junit.Assert.assertThat;
5+
6+
import java.util.List;
7+
8+
import org.baeldung.config.MongoConfig;
9+
import org.baeldung.model.User;
10+
import org.junit.After;
11+
import org.junit.Before;
12+
import org.junit.Test;
13+
import org.junit.runner.RunWith;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.data.domain.PageRequest;
16+
import org.springframework.data.domain.Pageable;
17+
import org.springframework.data.domain.Sort;
18+
import org.springframework.data.mongodb.core.MongoTemplate;
19+
import org.springframework.data.mongodb.core.query.Criteria;
20+
import org.springframework.data.mongodb.core.query.Query;
21+
import org.springframework.test.context.ContextConfiguration;
22+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
23+
24+
@RunWith(SpringJUnit4ClassRunner.class)
25+
@ContextConfiguration(classes = MongoConfig.class)
26+
public class MongoTemplateQueryIntegrationTest {
27+
28+
@Autowired
29+
private MongoTemplate mongoTemplate;
30+
31+
@Before
32+
public void testSetup() {
33+
mongoTemplate.createCollection(User.class);
34+
}
35+
36+
@After
37+
public void tearDown() {
38+
mongoTemplate.dropCollection(User.class);
39+
}
40+
41+
@Test
42+
public void givenUsersExist_whenFindingUserWithAgeLessThan50AndGreateThan20_thenUsersAreFound() {
43+
User user = new User();
44+
user.setName("Eric");
45+
user.setAge(45);
46+
mongoTemplate.insert(user);
47+
user = new User();
48+
user.setName("Antony");
49+
user.setAge(55);
50+
mongoTemplate.insert(user);
51+
52+
Query query = new Query();
53+
query.addCriteria(Criteria.where("age").lt(50).gt(20));
54+
List<User> users = mongoTemplate.find(query, User.class);
55+
56+
assertThat(users.size(), is(1));
57+
}
58+
59+
@Test
60+
public void givenUsersExist_whenFindingUserWithNameStartWithA_thenUsersAreFound() {
61+
User user = new User();
62+
user.setName("Eric");
63+
user.setAge(45);
64+
mongoTemplate.insert(user);
65+
66+
user = new User();
67+
user.setName("Antony");
68+
user.setAge(33);
69+
mongoTemplate.insert(user);
70+
71+
user = new User();
72+
user.setName("Alice");
73+
user.setAge(35);
74+
mongoTemplate.insert(user);
75+
76+
Query query = new Query();
77+
query.addCriteria(Criteria.where("name").regex("^A"));
78+
79+
List<User> users = mongoTemplate.find(query, User.class);
80+
assertThat(users.size(), is(2));
81+
}
82+
83+
@Test
84+
public void givenUsersExist_whenFindingByPage_thenUsersAreFoundByPage() {
85+
User user = new User();
86+
user.setName("Eric");
87+
user.setAge(45);
88+
mongoTemplate.insert(user);
89+
90+
user = new User();
91+
user.setName("Antony");
92+
user.setAge(33);
93+
mongoTemplate.insert(user);
94+
95+
user = new User();
96+
user.setName("Alice");
97+
user.setAge(35);
98+
mongoTemplate.insert(user);
99+
100+
final Pageable pageableRequest = new PageRequest(0, 2);
101+
Query query = new Query();
102+
query.with(pageableRequest);
103+
104+
List<User> users = mongoTemplate.find(query, User.class);
105+
assertThat(users.size(), is(2));
106+
}
107+
108+
@Test
109+
public void givenUsersExist_whenFindingUsersAndSortThem_thenUsersAreFoundAndSorted() {
110+
User user = new User();
111+
user.setName("Eric");
112+
user.setAge(45);
113+
mongoTemplate.insert(user);
114+
115+
user = new User();
116+
user.setName("Antony");
117+
user.setAge(33);
118+
mongoTemplate.insert(user);
119+
120+
user = new User();
121+
user.setName("Alice");
122+
user.setAge(35);
123+
mongoTemplate.insert(user);
124+
125+
Query query = new Query();
126+
query.with(new Sort(Sort.Direction.ASC, "age"));
127+
128+
List<User> users = mongoTemplate.find(query, User.class);
129+
assertThat(users.size(), is(3));
130+
}
131+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package org.baeldung.repository;
2+
3+
import static org.hamcrest.CoreMatchers.is;
4+
import static org.junit.Assert.assertThat;
5+
6+
import java.util.List;
7+
8+
import org.baeldung.config.MongoConfig;
9+
import org.baeldung.model.QUser;
10+
import org.baeldung.model.User;
11+
import org.junit.After;
12+
import org.junit.Before;
13+
import org.junit.Test;
14+
import org.junit.runner.RunWith;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.data.mongodb.core.MongoOperations;
17+
import org.springframework.test.context.ContextConfiguration;
18+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
19+
20+
import com.mysema.query.types.Predicate;
21+
22+
@RunWith(SpringJUnit4ClassRunner.class)
23+
@ContextConfiguration(classes = MongoConfig.class)
24+
public class MongoRepositoryQueryIntegrationTest {
25+
26+
@Autowired
27+
private UserRepository userRepository;
28+
29+
@Autowired
30+
private MongoOperations mongoOps;
31+
32+
@Before
33+
public void testSetup() {
34+
mongoOps.createCollection(User.class);
35+
}
36+
37+
@After
38+
public void tearDown() {
39+
mongoOps.dropCollection(User.class);
40+
}
41+
42+
@Test
43+
public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() {
44+
User user = new User();
45+
user.setName("Jon");
46+
mongoOps.insert(user);
47+
48+
user = new User();
49+
user.setName("Jon");
50+
mongoOps.insert(user);
51+
52+
user = new User();
53+
user.setName("Jim");
54+
mongoOps.insert(user);
55+
56+
List<User> users = userRepository.findUsersByName("Jon");
57+
assertThat(users.size(), is(2));
58+
}
59+
60+
@Test
61+
public void givenUsersExist_whenFindingUsersByAgeAndReturningNames_thenUsersAreFoundAndReturnedNames() {
62+
User user = new User();
63+
user.setName("Jon");
64+
user.setAge(20);
65+
mongoOps.insert(user);
66+
67+
user = new User();
68+
user.setName("Jon");
69+
user.setAge(30);
70+
mongoOps.insert(user);
71+
72+
user = new User();
73+
user.setName("Jim");
74+
user.setAge(40);
75+
mongoOps.insert(user);
76+
77+
List<String> users = userRepository.findUsersByAgeAndReturnNames(30);
78+
assertThat(users.size(), is(1));
79+
}
80+
81+
@Test
82+
public void givenUsersExist_whenFindingUsersWithAgeCreaterThanAndLessThan_thenUsersAreFound() {
83+
User user = new User();
84+
user.setAge(20);
85+
user.setName("Jon");
86+
mongoOps.insert(user);
87+
88+
user = new User();
89+
user.setAge(50);
90+
user.setName("Jon");
91+
mongoOps.insert(user);
92+
93+
user = new User();
94+
user.setAge(33);
95+
user.setName("Jim");
96+
mongoOps.insert(user);
97+
98+
List<User> users = userRepository.findByAgeBetween(26, 40);
99+
assertThat(users.size(), is(1));
100+
}
101+
102+
@Test
103+
public void givenUsersExist_whenFindingUsersAndCount_thenUserAreFound() {
104+
User user = new User();
105+
user.setName("Alexey");
106+
mongoOps.insert(user);
107+
108+
QUser qUser = new QUser("user");
109+
110+
Predicate predicate = qUser.name.eq("Alexey");
111+
List<User> users = (List<User>) userRepository.findAll(predicate);
112+
113+
assertThat(users.size(), is(1));
114+
}
115+
116+
}

0 commit comments

Comments
 (0)