diff --git a/spring-jpa/pom.xml b/spring-jpa/pom.xml index b1e58a35ab..675f893133 100644 --- a/spring-jpa/pom.xml +++ b/spring-jpa/pom.xml @@ -46,6 +46,13 @@ ${mysql-connector-java.version} runtime + + org.springframework.data + spring-data-jpa + 1.6.0.RELEASE + compile + + diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/IUserDAO.java b/spring-jpa/src/main/java/org/baeldung/persistence/dao/IUserDAO.java new file mode 100644 index 0000000000..a03824b4ae --- /dev/null +++ b/spring-jpa/src/main/java/org/baeldung/persistence/dao/IUserDAO.java @@ -0,0 +1,11 @@ +package org.baeldung.persistence.dao; + +import java.util.List; + +import org.baeldung.persistence.model.User; + +public interface IUserDAO { + List searchUser(String first, String last, int minAge); + + void save(User entity); +} diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/UserDAO.java b/spring-jpa/src/main/java/org/baeldung/persistence/dao/UserDAO.java new file mode 100644 index 0000000000..56e79b504d --- /dev/null +++ b/spring-jpa/src/main/java/org/baeldung/persistence/dao/UserDAO.java @@ -0,0 +1,43 @@ +package org.baeldung.persistence.dao; + +import java.util.List; + +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 searchUser(final String first, final String last, final int minAge) { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery query = builder.createQuery(User.class); + final Root r = query.from(User.class); + + Predicate predicate = builder.conjunction(); + predicate = builder.and(predicate, builder.like(r.get("firstName"), "%" + first + "%")); + predicate = builder.and(predicate, builder.like(r.get("lastName"), "%" + last + "%")); + predicate = builder.and(predicate, builder.greaterThanOrEqualTo(r.get("age"), minAge)); + + query.where(predicate); + + final List result = entityManager.createQuery(query).getResultList(); + return result; + } + + @Override + public void save(final User entity) { + entityManager.persist(entity); + } + +} diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java b/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java new file mode 100644 index 0000000000..d220f4458e --- /dev/null +++ b/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java @@ -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(); + } + +} \ No newline at end of file diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/service/UserService.java b/spring-jpa/src/main/java/org/baeldung/persistence/service/UserService.java new file mode 100644 index 0000000000..90ab7f42f5 --- /dev/null +++ b/spring-jpa/src/main/java/org/baeldung/persistence/service/UserService.java @@ -0,0 +1,28 @@ +package org.baeldung.persistence.service; + +import java.util.List; + +import org.baeldung.persistence.dao.IUserDAO; +import org.baeldung.persistence.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class UserService { + @Autowired + private IUserDAO dao; + + public UserService() { + super(); + } + + public void saveUser(final User user) { + dao.save(user); + } + + public List searchUser(final String first, final String last, final int minAge) { + return dao.searchUser(first, last, minAge); + } +} diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryTest.java new file mode 100644 index 0000000000..5d76a7ce5c --- /dev/null +++ b/spring-jpa/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryTest.java @@ -0,0 +1,85 @@ +package org.baeldung.persistence.query; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.baeldung.config.PersistenceJPAConfig; +import org.baeldung.persistence.model.User; +import org.baeldung.persistence.service.UserService; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.test.context.transaction.TransactionConfiguration; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) +@Transactional +@TransactionConfiguration +public class JPACriteriaQueryTest { + + @Autowired + private UserService userService; + + private User user_john; + + private User user_tom; + + @Before + public void init() { + user_john = new User(); + user_john.setFirstName("John"); + user_john.setLastName("Doe"); + user_john.setEmail("john@doe.com"); + user_john.setAge(22); + userService.saveUser(user_john); + + user_tom = new User(); + user_tom.setFirstName("Tom"); + user_tom.setLastName("Doe"); + user_tom.setEmail("tom@doe.com"); + user_tom.setAge(26); + userService.saveUser(user_tom); + } + + @Test + public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() { + final List result = userService.searchUser("John", "Doe", 0); + + assertEquals(1, result.size()); + assertEquals(user_john.getEmail(), result.get(0).getEmail()); + } + + @Test + public void givenLast_whenGettingListOfUsers_thenCorrect() { + final List result = userService.searchUser("", "doe", 0); + assertEquals(2, result.size()); + } + + @Test + public void givenLastAndAge_whenGettingListOfUsers_thenCorrect() { + final List result = userService.searchUser("", "doe", 25); + + assertEquals(1, result.size()); + assertEquals(user_tom.getEmail(), result.get(0).getEmail()); + } + + @Test + public void givenWrongFirstAndLast_whenGettingListOfUsers_thenCorrect() { + final List result = userService.searchUser("Adam", "Fox", 0); + assertEquals(0, result.size()); + } + + @Test + public void givenPartialFirstAndLast_whenGettingListOfUsers_thenCorrect() { + final List result = userService.searchUser("jo", "", 0); + + assertEquals(1, result.size()); + assertEquals(user_john.getEmail(), result.get(0).getEmail()); + } +}