Skip to content

Commit 9e1ae6d

Browse files
author
Eugen
committed
Merge pull request eugenp#116 from Doha2012/master
modify query code
2 parents 92e593c + 5ce7ecc commit 9e1ae6d

File tree

11 files changed

+573
-0
lines changed

11 files changed

+573
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.baeldung.persistence.dao;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import org.baeldung.persistence.model.User;
7+
8+
public interface IUserDAO {
9+
List<User> searchUser(Map<String, Object> params);
10+
11+
void save(User entity);
12+
}
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 java.util.List;
4+
import java.util.Map;
5+
6+
import javax.persistence.EntityManager;
7+
import javax.persistence.PersistenceContext;
8+
import javax.persistence.criteria.CriteriaBuilder;
9+
import javax.persistence.criteria.CriteriaQuery;
10+
import javax.persistence.criteria.Predicate;
11+
import javax.persistence.criteria.Root;
12+
13+
import org.baeldung.persistence.model.User;
14+
import org.springframework.stereotype.Repository;
15+
16+
@Repository
17+
public class UserDAO implements IUserDAO {
18+
19+
@PersistenceContext
20+
private EntityManager entityManager;
21+
22+
@Override
23+
public List<User> searchUser(final Map<String, Object> params) {
24+
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
25+
final CriteriaQuery<User> query = builder.createQuery(User.class);
26+
final Root r = query.from(User.class);
27+
28+
Predicate predicate = builder.conjunction();
29+
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() + "%"));
36+
}
37+
}
38+
query.where(predicate);
39+
40+
final List<User> result = entityManager.createQuery(query).getResultList();
41+
return result;
42+
}
43+
44+
@Override
45+
public void save(final User entity) {
46+
entityManager.persist(entity);
47+
}
48+
49+
}
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: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.baeldung.persistence.dao;
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+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
import org.baeldung.persistence.model.User;
12+
import org.springframework.data.jpa.domain.Specification;
13+
import org.springframework.data.jpa.domain.Specifications;
14+
15+
public class UserSpecificationsBuilder {
16+
17+
public static Specification<User> buildUserSpecs(final Map<String, Object> params) {
18+
if (params.size() == 0)
19+
return null;
20+
21+
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+
}
34+
}
35+
36+
if (specs.size() == 0)
37+
return null;
38+
39+
Specification<User> result = specs.get(0);
40+
for (int i = 1; i < specs.size(); i++) {
41+
result = Specifications.where(result).and(specs.get(i));
42+
}
43+
return result;
44+
45+
}
46+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.baeldung.persistence.model;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.GenerationType;
6+
import javax.persistence.Id;
7+
8+
@Entity
9+
public class User {
10+
11+
@Id
12+
@GeneratedValue(strategy = GenerationType.AUTO)
13+
private Long id;
14+
15+
private String firstName;
16+
17+
private String lastName;
18+
19+
private String email;
20+
21+
private int age;
22+
23+
public User() {
24+
super();
25+
}
26+
27+
public Long getId() {
28+
return id;
29+
}
30+
31+
public void setId(final Long id) {
32+
this.id = id;
33+
}
34+
35+
public String getFirstName() {
36+
return firstName;
37+
}
38+
39+
public void setFirstName(final String firstName) {
40+
this.firstName = firstName;
41+
}
42+
43+
public String getLastName() {
44+
return lastName;
45+
}
46+
47+
public void setLastName(final String lastName) {
48+
this.lastName = lastName;
49+
}
50+
51+
public String getEmail() {
52+
return email;
53+
}
54+
55+
public void setEmail(final String username) {
56+
email = username;
57+
}
58+
59+
public int getAge() {
60+
return age;
61+
}
62+
63+
public void setAge(final int age) {
64+
this.age = age;
65+
}
66+
67+
@Override
68+
public int hashCode() {
69+
final int prime = 31;
70+
int result = 1;
71+
result = prime * result + ((email == null) ? 0 : email.hashCode());
72+
return result;
73+
}
74+
75+
@Override
76+
public boolean equals(final Object obj) {
77+
if (this == obj)
78+
return true;
79+
if (obj == null)
80+
return false;
81+
if (getClass() != obj.getClass())
82+
return false;
83+
final User user = (User) obj;
84+
if (!email.equals(user.email))
85+
return false;
86+
return true;
87+
}
88+
89+
@Override
90+
public String toString() {
91+
final StringBuilder builder = new StringBuilder();
92+
builder.append("User [firstName=").append(firstName).append("]").append("[lastName=").append(lastName).append("]").append("[username").append(email).append("]");
93+
return builder.toString();
94+
}
95+
96+
}
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+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.baeldung.persistence.service.impl;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import org.baeldung.persistence.dao.IUserDAO;
7+
import org.baeldung.persistence.dao.UserRepository;
8+
import org.baeldung.persistence.dao.UserSpecificationsBuilder;
9+
import org.baeldung.persistence.model.User;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.data.jpa.domain.Specification;
12+
import org.springframework.stereotype.Service;
13+
import org.springframework.transaction.annotation.Transactional;
14+
15+
@Service
16+
@Transactional
17+
public class UserService {
18+
@Autowired
19+
private IUserDAO dao;
20+
21+
@Autowired
22+
private UserRepository repository;
23+
24+
public UserService() {
25+
super();
26+
}
27+
28+
public void saveUser(final User user) {
29+
dao.save(user);
30+
}
31+
32+
public List<User> searchUser(final Map<String, Object> params) {
33+
return dao.searchUser(params);
34+
}
35+
36+
public List<User> searchBySpecification(final Map<String, Object> params) {
37+
final Specification<User> spec = UserSpecificationsBuilder.buildUserSpecs(params);
38+
if (spec == null)
39+
return repository.findAll();
40+
return repository.findAll(spec);
41+
}
42+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.baeldung.web.controller;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.regex.Matcher;
7+
import java.util.regex.Pattern;
8+
9+
import org.baeldung.persistence.model.User;
10+
import org.baeldung.persistence.service.impl.UserService;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.stereotype.Controller;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RequestMethod;
15+
import org.springframework.web.bind.annotation.RequestParam;
16+
import org.springframework.web.bind.annotation.ResponseBody;
17+
18+
@Controller
19+
public class UserController {
20+
21+
@Autowired
22+
private UserService service;
23+
24+
public UserController() {
25+
super();
26+
}
27+
28+
@RequestMapping(method = RequestMethod.GET, value = "/users")
29+
@ResponseBody
30+
public List<User> findAll(@RequestParam(value = "search", required = false) final String search) {
31+
final Map<String, Object> params = new HashMap<String, Object>();
32+
33+
if (search != null) {
34+
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
35+
final Matcher matcher = pattern.matcher(search + ",");
36+
while (matcher.find()) {
37+
params.put(matcher.group(1), matcher.group(2));
38+
}
39+
}
40+
return service.searchUser(params);
41+
}
42+
43+
@RequestMapping(method = RequestMethod.GET, value = "/users/spec")
44+
@ResponseBody
45+
public List<User> findAllBySpecification(@RequestParam(value = "search", required = false) final String search) {
46+
final Map<String, Object> params = new HashMap<String, Object>();
47+
48+
if (search != null) {
49+
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
50+
final Matcher matcher = pattern.matcher(search + ",");
51+
while (matcher.find()) {
52+
params.put(matcher.group(1), matcher.group(2));
53+
}
54+
}
55+
return service.searchBySpecification(params);
56+
}
57+
58+
@RequestMapping(method = RequestMethod.GET, value = "/users/new")
59+
@ResponseBody
60+
public long addUser(@RequestParam("first") final String first, @RequestParam("last") final String last, @RequestParam("age") final int age) {
61+
final User user = new User();
62+
user.setFirstName(first);
63+
user.setLastName(last);
64+
user.setEmail("[email protected]");
65+
user.setAge(age);
66+
service.saveUser(user);
67+
return user.getId();
68+
}
69+
}

0 commit comments

Comments
 (0)