Skip to content

Commit 88bd851

Browse files
committed
add spring jpa specifications test
1 parent c4def2d commit 88bd851

File tree

6 files changed

+175
-19
lines changed

6 files changed

+175
-19
lines changed

spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.springframework.context.annotation.PropertySource;
1313
import org.springframework.core.env.Environment;
1414
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
15+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
1516
import org.springframework.jdbc.datasource.DriverManagerDataSource;
1617
import org.springframework.orm.jpa.JpaTransactionManager;
1718
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@@ -25,6 +26,7 @@
2526
@EnableTransactionManagement
2627
@PropertySource({ "classpath:persistence-mysql.properties" })
2728
@ComponentScan({ "org.baeldung.persistence" })
29+
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
2830
public class PersistenceJPAConfig {
2931

3032
@Autowired
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.baeldung.persistence.dao;
2+
3+
import org.baeldung.persistence.model.User;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
6+
7+
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
8+
9+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.baeldung.persistence.dao;
2+
3+
import javax.persistence.criteria.CriteriaBuilder;
4+
import javax.persistence.criteria.CriteriaQuery;
5+
import javax.persistence.criteria.Predicate;
6+
import javax.persistence.criteria.Root;
7+
8+
import org.baeldung.persistence.model.User;
9+
import org.baeldung.persistence.model.User_;
10+
import org.springframework.data.jpa.domain.Specification;
11+
12+
public class UserSpecifications {
13+
public static Specification<User> firstNameIsLike(final String term) {
14+
15+
return new Specification<User>() {
16+
@Override
17+
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
18+
return cb.like(root.get(User_.firstName), "%"+term+"%");
19+
}
20+
21+
};
22+
}
23+
24+
public static Specification<User> lastNameIsLike(final String term) {
25+
26+
return new Specification<User>() {
27+
@Override
28+
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
29+
return cb.like(root.get(User_.lastName), "%" + term + "%");
30+
}
31+
32+
};
33+
}
34+
35+
public static Specification<User> ageIsGreaterThan(final int minAge) {
36+
37+
return new Specification<User>() {
38+
@Override
39+
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
40+
return cb.greaterThanOrEqualTo(root.get(User_.age), minAge);
41+
}
42+
43+
};
44+
}
45+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.baeldung.persistence.model;
2+
3+
import javax.persistence.metamodel.SingularAttribute;
4+
import javax.persistence.metamodel.StaticMetamodel;
5+
6+
@StaticMetamodel(User.class)
7+
public class User_ {
8+
public static volatile SingularAttribute<User, String> firstName;
9+
public static volatile SingularAttribute<User, String> lastName;
10+
public static volatile SingularAttribute<User, Integer> age;
11+
}

spring-jpa/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryTest.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,33 @@ public class JPACriteriaQueryTest {
2626
@Autowired
2727
private UserService userService;
2828

29-
private User user_john;
29+
private User userJohn;
3030

31-
private User user_tom;
31+
private User userTom;
3232

3333
@Before
3434
public void init() {
35-
user_john = new User();
36-
user_john.setFirstName("John");
37-
user_john.setLastName("Doe");
38-
user_john.setEmail("[email protected]");
39-
user_john.setAge(22);
40-
userService.saveUser(user_john);
41-
42-
user_tom = new User();
43-
user_tom.setFirstName("Tom");
44-
user_tom.setLastName("Doe");
45-
user_tom.setEmail("[email protected]");
46-
user_tom.setAge(26);
47-
userService.saveUser(user_tom);
35+
userJohn = new User();
36+
userJohn.setFirstName("John");
37+
userJohn.setLastName("Doe");
38+
userJohn.setEmail("[email protected]");
39+
userJohn.setAge(22);
40+
userService.saveUser(userJohn);
41+
42+
userTom = new User();
43+
userTom.setFirstName("Tom");
44+
userTom.setLastName("Doe");
45+
userTom.setEmail("[email protected]");
46+
userTom.setAge(26);
47+
userService.saveUser(userTom);
4848
}
4949

5050
@Test
5151
public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
5252
final List<User> result = userService.searchUser("John", "Doe", 0);
5353

5454
assertEquals(1, result.size());
55-
assertEquals(user_john.getEmail(), result.get(0).getEmail());
55+
assertEquals(userJohn.getEmail(), result.get(0).getEmail());
5656
}
5757

5858
@Test
@@ -66,7 +66,7 @@ public void givenLastAndAge_whenGettingListOfUsers_thenCorrect() {
6666
final List<User> result = userService.searchUser("", "doe", 25);
6767

6868
assertEquals(1, result.size());
69-
assertEquals(user_tom.getEmail(), result.get(0).getEmail());
69+
assertEquals(userTom.getEmail(), result.get(0).getEmail());
7070
}
7171

7272
@Test
@@ -76,10 +76,10 @@ public void givenWrongFirstAndLast_whenGettingListOfUsers_thenCorrect() {
7676
}
7777

7878
@Test
79-
public void givenPartialFirstAndLast_whenGettingListOfUsers_thenCorrect() {
79+
public void givenPartialFirst_whenGettingListOfUsers_thenCorrect() {
8080
final List<User> result = userService.searchUser("jo", "", 0);
8181

8282
assertEquals(1, result.size());
83-
assertEquals(user_john.getEmail(), result.get(0).getEmail());
83+
assertEquals(userJohn.getEmail(), result.get(0).getEmail());
8484
}
8585
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.baeldung.persistence.query;
2+
3+
import static org.baeldung.persistence.dao.UserSpecifications.ageIsGreaterThan;
4+
import static org.baeldung.persistence.dao.UserSpecifications.firstNameIsLike;
5+
import static org.baeldung.persistence.dao.UserSpecifications.lastNameIsLike;
6+
import static org.junit.Assert.assertEquals;
7+
8+
import java.util.List;
9+
10+
import org.baeldung.config.PersistenceJPAConfig;
11+
import org.baeldung.persistence.dao.UserRepository;
12+
import org.baeldung.persistence.model.User;
13+
import org.junit.Before;
14+
import org.junit.Test;
15+
import org.junit.runner.RunWith;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.data.jpa.domain.Specifications;
18+
import org.springframework.test.context.ContextConfiguration;
19+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
20+
import org.springframework.test.context.support.AnnotationConfigContextLoader;
21+
import org.springframework.test.context.transaction.TransactionConfiguration;
22+
import org.springframework.transaction.annotation.Transactional;
23+
24+
@RunWith(SpringJUnit4ClassRunner.class)
25+
@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
26+
@Transactional
27+
@TransactionConfiguration
28+
public class JPASpecificationsTest {
29+
30+
@Autowired
31+
private UserRepository repository;
32+
33+
private User userJohn;
34+
35+
private User userTom;
36+
37+
@Before
38+
public void init() {
39+
userJohn = new User();
40+
userJohn.setFirstName("John");
41+
userJohn.setLastName("Doe");
42+
userJohn.setEmail("[email protected]");
43+
userJohn.setAge(22);
44+
repository.save(userJohn);
45+
46+
userTom = new User();
47+
userTom.setFirstName("Tom");
48+
userTom.setLastName("Doe");
49+
userTom.setEmail("[email protected]");
50+
userTom.setAge(26);
51+
repository.save(userTom);
52+
}
53+
54+
@Test
55+
public void givenLast_whenGettingListOfUsers_thenCorrect() {
56+
final List<User> result = repository.findAll(lastNameIsLike("doe"));
57+
assertEquals(2, result.size());
58+
}
59+
60+
@Test
61+
public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
62+
final List<User> result = repository.findAll(Specifications.where(lastNameIsLike("doe")).and(firstNameIsLike("john")));
63+
64+
assertEquals(1, result.size());
65+
assertEquals(userJohn.getEmail(), result.get(0).getEmail());
66+
}
67+
68+
@Test
69+
public void givenLastAndAge_whenGettingListOfUsers_thenCorrect() {
70+
final List<User> result = repository.findAll(Specifications.where(lastNameIsLike("doe")).and(ageIsGreaterThan(25)));
71+
72+
assertEquals(1, result.size());
73+
assertEquals(userTom.getEmail(), result.get(0).getEmail());
74+
}
75+
76+
@Test
77+
public void givenWrongFirstAndLast_whenGettingListOfUsers_thenCorrect() {
78+
final List<User> result = repository.findAll(Specifications.where(lastNameIsLike("Adam")).and(firstNameIsLike("Fox")));
79+
assertEquals(0, result.size());
80+
}
81+
82+
@Test
83+
public void givenPartialFirst_whenGettingListOfUsers_thenCorrect() {
84+
final List<User> result = repository.findAll(firstNameIsLike("jo"));
85+
86+
assertEquals(1, result.size());
87+
assertEquals(userJohn.getEmail(), result.get(0).getEmail());
88+
}
89+
}

0 commit comments

Comments
 (0)