Skip to content

Commit 05e2e58

Browse files
author
Eugen
committed
Merge pull request eugenp#119 from Doha2012/master
Fix jpa criteria and specification test
2 parents 4ad6cc9 + 34ae3b7 commit 05e2e58

File tree

10 files changed

+158
-107
lines changed

10 files changed

+158
-107
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.baeldung.persistence.dao;
22

33
import java.util.List;
4-
import java.util.Map;
54

65
import org.baeldung.persistence.model.User;
6+
import org.baeldung.web.util.SearchCriteria;
77

88
public interface IUserDAO {
9-
List<User> searchUser(Map<String, Object> params);
9+
List<User> searchUser(List<SearchCriteria> params);
1010

1111
void save(User entity);
1212
}

spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserDAO.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.baeldung.persistence.dao;
22

33
import java.util.List;
4-
import java.util.Map;
54

65
import javax.persistence.EntityManager;
76
import javax.persistence.PersistenceContext;
@@ -11,6 +10,7 @@
1110
import javax.persistence.criteria.Root;
1211

1312
import org.baeldung.persistence.model.User;
13+
import org.baeldung.web.util.SearchCriteria;
1414
import org.springframework.stereotype.Repository;
1515

1616
@Repository
@@ -20,19 +20,24 @@ public class UserDAO implements IUserDAO {
2020
private EntityManager entityManager;
2121

2222
@Override
23-
public List<User> searchUser(final Map<String, Object> params) {
23+
public List<User> searchUser(final List<SearchCriteria> params) {
2424
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
2525
final CriteriaQuery<User> query = builder.createQuery(User.class);
2626
final Root r = query.from(User.class);
2727

2828
Predicate predicate = builder.conjunction();
2929

30-
for (final Map.Entry<String, Object> param: params.entrySet()){
31-
if (param.getKey().equalsIgnoreCase("age")) {
32-
predicate = builder.and(predicate, builder.greaterThanOrEqualTo(r.get(param.getKey()), Integer.parseInt(param.getValue().toString())));
33-
}
34-
else{
35-
predicate = builder.and(predicate, builder.like(r.get(param.getKey()), "%" + param.getValue() + "%"));
30+
for (final SearchCriteria param : params) {
31+
if (param.getOperation().equalsIgnoreCase(">")) {
32+
predicate = builder.and(predicate, builder.greaterThanOrEqualTo(r.get(param.getKey()), param.getValue().toString()));
33+
} else if (param.getOperation().equalsIgnoreCase("<")) {
34+
predicate = builder.and(predicate, builder.lessThanOrEqualTo(r.get(param.getKey()), param.getValue().toString()));
35+
} else if (param.getOperation().equalsIgnoreCase(":")) {
36+
if (r.get(param.getKey()).getJavaType() == String.class) {
37+
predicate = builder.and(predicate, builder.like(r.get(param.getKey()), "%" + param.getValue() + "%"));
38+
} else {
39+
predicate = builder.and(predicate, builder.equal(r.get(param.getKey()), param.getValue()));
40+
}
3641
}
3742
}
3843
query.where(predicate);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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.web.util.SearchCriteria;
10+
import org.springframework.data.jpa.domain.Specification;
11+
12+
public class UserSpecification implements Specification<User> {
13+
14+
private SearchCriteria criteria;
15+
16+
public UserSpecification() {
17+
18+
}
19+
20+
public UserSpecification(final SearchCriteria criteria) {
21+
super();
22+
this.criteria = criteria;
23+
}
24+
25+
public SearchCriteria getCriteria() {
26+
return criteria;
27+
}
28+
29+
public void setCriteria(final SearchCriteria criteria) {
30+
this.criteria = criteria;
31+
}
32+
33+
@Override
34+
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder builder) {
35+
if (criteria.getOperation().equalsIgnoreCase(">")) {
36+
return builder.greaterThanOrEqualTo(root.<String> get(criteria.getKey()), criteria.getValue().toString());
37+
} else if (criteria.getOperation().equalsIgnoreCase("<")) {
38+
return builder.lessThanOrEqualTo(root.<String> get(criteria.getKey()), criteria.getValue().toString());
39+
} else if (criteria.getOperation().equalsIgnoreCase(":")) {
40+
if (root.get(criteria.getKey()).getJavaType() == String.class) {
41+
return builder.like(root.<String>get(criteria.getKey()), "%" + criteria.getValue() + "%");
42+
} else {
43+
return builder.equal(root.get(criteria.getKey()), criteria.getValue());
44+
}
45+
}
46+
return null;
47+
}
48+
49+
}

spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecifications.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,23 @@
11
package org.baeldung.persistence.dao;
22

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-
73
import java.util.ArrayList;
84
import java.util.List;
9-
import java.util.Map;
105

116
import org.baeldung.persistence.model.User;
7+
import org.baeldung.web.util.SearchCriteria;
128
import org.springframework.data.jpa.domain.Specification;
139
import org.springframework.data.jpa.domain.Specifications;
1410

1511
public class UserSpecificationsBuilder {
1612

17-
public static Specification<User> buildUserSpecs(final Map<String, Object> params) {
13+
public static Specification<User> buildUserSpecs(final List<SearchCriteria> params) {
1814
if (params.size() == 0)
1915
return null;
2016

2117
final List<Specification<User>> specs = new ArrayList<Specification<User>>();
22-
String key, value;
23-
24-
for (final Map.Entry<String, Object> param : params.entrySet()) {
25-
key = param.getKey();
26-
value = param.getValue().toString();
27-
if (key.equalsIgnoreCase("age")) {
28-
specs.add(ageIsGreaterThan(Integer.parseInt(value)));
29-
} else if (key.equalsIgnoreCase("firstName")) {
30-
specs.add(firstNameIsLike(value));
31-
} else if (key.equalsIgnoreCase("lastName")) {
32-
specs.add(lastNameIsLike(value));
33-
}
18+
19+
for (final SearchCriteria param : params) {
20+
specs.add(new UserSpecification(param));
3421
}
3522

3623
if (specs.size() == 0)

spring-security-rest-full/src/main/java/org/baeldung/persistence/service/impl/UserService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.baeldung.persistence.service.impl;
22

33
import java.util.List;
4-
import java.util.Map;
54

65
import org.baeldung.persistence.dao.IUserDAO;
76
import org.baeldung.persistence.dao.UserRepository;
87
import org.baeldung.persistence.dao.UserSpecificationsBuilder;
98
import org.baeldung.persistence.model.User;
9+
import org.baeldung.web.util.SearchCriteria;
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.data.jpa.domain.Specification;
1212
import org.springframework.stereotype.Service;
@@ -29,11 +29,11 @@ public void saveUser(final User user) {
2929
dao.save(user);
3030
}
3131

32-
public List<User> searchUser(final Map<String, Object> params) {
32+
public List<User> searchUser(final List<SearchCriteria> params) {
3333
return dao.searchUser(params);
3434
}
3535

36-
public List<User> searchBySpecification(final Map<String, Object> params) {
36+
public List<User> searchBySpecification(final List<SearchCriteria> params) {
3737
final Specification<User> spec = UserSpecificationsBuilder.buildUserSpecs(params);
3838
if (spec == null)
3939
return repository.findAll();

spring-security-rest-full/src/main/java/org/baeldung/web/controller/UserController.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.baeldung.web.controller;
22

3+
import java.util.ArrayList;
34
import java.util.HashMap;
45
import java.util.List;
56
import java.util.Map;
@@ -10,6 +11,7 @@
1011
import org.baeldung.persistence.model.User;
1112
import org.baeldung.persistence.service.impl.MyUserService;
1213
import org.baeldung.persistence.service.impl.UserService;
14+
import org.baeldung.web.util.SearchCriteria;
1315
import org.springframework.beans.factory.annotation.Autowired;
1416
import org.springframework.stereotype.Controller;
1517
import org.springframework.web.bind.annotation.RequestMapping;
@@ -33,13 +35,13 @@ public UserController() {
3335
@RequestMapping(method = RequestMethod.GET, value = "/users")
3436
@ResponseBody
3537
public List<User> findAll(@RequestParam(value = "search", required = false) final String search) {
36-
final Map<String, Object> params = new HashMap<String, Object>();
38+
final List<SearchCriteria> params = new ArrayList<SearchCriteria>();
3739

3840
if (search != null) {
39-
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
41+
final Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
4042
final Matcher matcher = pattern.matcher(search + ",");
4143
while (matcher.find()) {
42-
params.put(matcher.group(1), matcher.group(2));
44+
params.add(new SearchCriteria(matcher.group(1), matcher.group(2), matcher.group(3)));
4345
}
4446
}
4547
return service.searchUser(params);
@@ -48,13 +50,13 @@ public List<User> findAll(@RequestParam(value = "search", required = false) fina
4850
@RequestMapping(method = RequestMethod.GET, value = "/users/spec")
4951
@ResponseBody
5052
public List<User> findAllBySpecification(@RequestParam(value = "search", required = false) final String search) {
51-
final Map<String, Object> params = new HashMap<String, Object>();
53+
final List<SearchCriteria> params = new ArrayList<SearchCriteria>();
5254

5355
if (search != null) {
54-
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
56+
final Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
5557
final Matcher matcher = pattern.matcher(search + ",");
5658
while (matcher.find()) {
57-
params.put(matcher.group(1), matcher.group(2));
59+
params.add(new SearchCriteria(matcher.group(1), matcher.group(2), matcher.group(3)));
5860
}
5961
}
6062
return service.searchBySpecification(params);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.baeldung.web.util;
2+
3+
public class SearchCriteria {
4+
5+
private String key;
6+
private String operation;
7+
private Object value;
8+
9+
public SearchCriteria() {
10+
11+
}
12+
13+
public SearchCriteria(final String key, final String operation, final Object value) {
14+
super();
15+
this.key = key;
16+
this.operation = operation;
17+
this.value = value;
18+
}
19+
20+
public String getKey() {
21+
return key;
22+
}
23+
24+
public void setKey(final String key) {
25+
this.key = key;
26+
}
27+
28+
public String getOperation() {
29+
return operation;
30+
}
31+
32+
public void setOperation(final String operation) {
33+
this.operation = operation;
34+
}
35+
36+
public Object getValue() {
37+
return value;
38+
}
39+
40+
public void setValue(final Object value) {
41+
this.value = value;
42+
}
43+
44+
}

0 commit comments

Comments
 (0)