Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.baeldung.persistence.dao;

import java.util.List;
import java.util.Map;

import org.baeldung.persistence.model.User;

public interface IUserDAO {
List<User> searchUser(Map<String, Object> params);

void save(User entity);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.baeldung.persistence.dao;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.baeldung.persistence.model.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserDAO implements IUserDAO {

@PersistenceContext
private EntityManager entityManager;

@Override
public List<User> searchUser(final Map<String, Object> params) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<User> query = builder.createQuery(User.class);
final Root r = query.from(User.class);

Predicate predicate = builder.conjunction();

for (final Map.Entry<String, Object> param: params.entrySet()){
if (param.getKey().equalsIgnoreCase("age")) {
predicate = builder.and(predicate, builder.greaterThanOrEqualTo(r.get(param.getKey()), Integer.parseInt(param.getValue().toString())));
}
else{
predicate = builder.and(predicate, builder.like(r.get(param.getKey()), "%" + param.getValue() + "%"));
}
}
query.where(predicate);

final List<User> result = entityManager.createQuery(query).getResultList();
return result;
}

@Override
public void save(final User entity) {
entityManager.persist(entity);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.baeldung.persistence.dao;

import org.baeldung.persistence.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.baeldung.persistence.dao;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.baeldung.persistence.model.User;
import org.baeldung.persistence.model.User_;
import org.springframework.data.jpa.domain.Specification;

public class UserSpecifications {
public static Specification<User> firstNameIsLike(final String term) {

return new Specification<User>() {
@Override
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
return cb.like(root.get(User_.firstName), "%"+term+"%");
}

};
}

public static Specification<User> lastNameIsLike(final String term) {

return new Specification<User>() {
@Override
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
return cb.like(root.get(User_.lastName), "%" + term + "%");
}

};
}

public static Specification<User> ageIsGreaterThan(final int minAge) {

return new Specification<User>() {
@Override
public Predicate toPredicate(final Root<User> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
return cb.greaterThanOrEqualTo(root.get(User_.age), minAge);
}

};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.baeldung.persistence.dao;

import static org.baeldung.persistence.dao.UserSpecifications.ageIsGreaterThan;
import static org.baeldung.persistence.dao.UserSpecifications.firstNameIsLike;
import static org.baeldung.persistence.dao.UserSpecifications.lastNameIsLike;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.baeldung.persistence.model.User;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.domain.Specifications;

public class UserSpecificationsBuilder {

public static Specification<User> buildUserSpecs(final Map<String, Object> params) {
if (params.size() == 0)
return null;

final List<Specification<User>> specs = new ArrayList<Specification<User>>();
String key, value;

for (final Map.Entry<String, Object> param : params.entrySet()) {
key = param.getKey();
value = param.getValue().toString();
if (key.equalsIgnoreCase("age")) {
specs.add(ageIsGreaterThan(Integer.parseInt(value)));
} else if (key.equalsIgnoreCase("firstName")) {
specs.add(firstNameIsLike(value));
} else if (key.equalsIgnoreCase("lastName")) {
specs.add(lastNameIsLike(value));
}
}

if (specs.size() == 0)
return null;

Specification<User> result = specs.get(0);
for (int i = 1; i < specs.size(); i++) {
result = Specifications.where(result).and(specs.get(i));
}
return result;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package org.baeldung.persistence.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String firstName;

private String lastName;

private String email;

private int age;

public User() {
super();
}

public Long getId() {
return id;
}

public void setId(final Long id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(final String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(final String lastName) {
this.lastName = lastName;
}

public String getEmail() {
return email;
}

public void setEmail(final String username) {
email = username;
}

public int getAge() {
return age;
}

public void setAge(final int age) {
this.age = age;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((email == null) ? 0 : email.hashCode());
return result;
}

@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final User user = (User) obj;
if (!email.equals(user.email))
return false;
return true;
}

@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("User [firstName=").append(firstName).append("]").append("[lastName=").append(lastName).append("]").append("[username").append(email).append("]");
return builder.toString();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.baeldung.persistence.model;

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel(User.class)
public class User_ {
public static volatile SingularAttribute<User, String> firstName;
public static volatile SingularAttribute<User, String> lastName;
public static volatile SingularAttribute<User, Integer> age;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.baeldung.persistence.service.impl;

import java.util.List;
import java.util.Map;

import org.baeldung.persistence.dao.IUserDAO;
import org.baeldung.persistence.dao.UserRepository;
import org.baeldung.persistence.dao.UserSpecificationsBuilder;
import org.baeldung.persistence.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserService {
@Autowired
private IUserDAO dao;

@Autowired
private UserRepository repository;

public UserService() {
super();
}

public void saveUser(final User user) {
dao.save(user);
}

public List<User> searchUser(final Map<String, Object> params) {
return dao.searchUser(params);
}

public List<User> searchBySpecification(final Map<String, Object> params) {
final Specification<User> spec = UserSpecificationsBuilder.buildUserSpecs(params);
if (spec == null)
return repository.findAll();
return repository.findAll(spec);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.baeldung.web.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.baeldung.persistence.model.User;
import org.baeldung.persistence.service.impl.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

@Autowired
private UserService service;

public UserController() {
super();
}

@RequestMapping(method = RequestMethod.GET, value = "/users")
@ResponseBody
public List<User> findAll(@RequestParam(value = "search", required = false) final String search) {
final Map<String, Object> params = new HashMap<String, Object>();

if (search != null) {
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
final Matcher matcher = pattern.matcher(search + ",");
while (matcher.find()) {
params.put(matcher.group(1), matcher.group(2));
}
}
return service.searchUser(params);
}

@RequestMapping(method = RequestMethod.GET, value = "/users/spec")
@ResponseBody
public List<User> findAllBySpecification(@RequestParam(value = "search", required = false) final String search) {
final Map<String, Object> params = new HashMap<String, Object>();

if (search != null) {
final Pattern pattern = Pattern.compile("(\\w+?):(\\w+?),");
final Matcher matcher = pattern.matcher(search + ",");
while (matcher.find()) {
params.put(matcher.group(1), matcher.group(2));
}
}
return service.searchBySpecification(params);
}

@RequestMapping(method = RequestMethod.GET, value = "/users/new")
@ResponseBody
public long addUser(@RequestParam("first") final String first, @RequestParam("last") final String last, @RequestParam("age") final int age) {
final User user = new User();
user.setFirstName(first);
user.setLastName(last);
user.setEmail("[email protected]");
user.setAge(age);
service.saveUser(user);
return user.getId();
}
}
Loading