diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml new file mode 100644 index 0000000000..78764f7148 --- /dev/null +++ b/persistence-modules/java-jpa/pom.xml @@ -0,0 +1,32 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../pom.xml + + 4.0.0 + + java-jpa + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + com.h2database + h2 + ${h2.version} + + + + + 5.3.1.Final + 1.4.197 + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java new file mode 100644 index 0000000000..bec1b8845a --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java @@ -0,0 +1,43 @@ +package com.baeldung.sqlresultsetmapping; + +import javax.persistence.*; + + +@SqlResultSetMapping( + name="EmployeeResult", + entities={ + @EntityResult( + entityClass = com.baeldung.sqlresultsetmapping.Employee.class, + fields={@FieldResult(name="id",column="employeeNumber"), + @FieldResult(name="name", column="name")} + ) + } +) +@NamedNativeQuery( + name="Employees", + query="SELECT id as employeeNumber, name FROM EMPLOYEE", + resultSetMapping = "EmployeeResult" +) +@Entity +public class Employee { + + @Id + private Long id; + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java new file mode 100644 index 0000000000..b72454c506 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java @@ -0,0 +1,80 @@ +package com.baeldung.sqlresultsetmapping; + +import javax.persistence.*; + +@SqlResultSetMappings(value = { + @SqlResultSetMapping(name = "ScheduleResult", + classes = { @ConstructorResult(targetClass = com.baeldung.sqlresultsetmapping.ScheduledDay.class, + columns = { @ColumnResult(name = "id", type = Long.class), + @ColumnResult(name = "employeeId", type = Long.class), + @ColumnResult(name = "hourIn"), + @ColumnResult(name = "hourOut"), + @ColumnResult(name = "dayOfWeek") }) }), + @SqlResultSetMapping(name = "FridayEmployeeResult", + columns = { @ColumnResult(name = "employeeId") }), + @SqlResultSetMapping(name = "EmployeeScheduleResults", + entities = { @EntityResult(entityClass = com.baeldung.sqlresultsetmapping.Employee.class), + @EntityResult(entityClass = com.baeldung.sqlresultsetmapping.ScheduledDay.class) + }) }) +@NamedNativeQuery(name = "FridayEmployees", + query = "SELECT employeeId FROM schedule_days WHERE dayOfWeek = 'FRIDAY'", + resultSetMapping = "FridayEmployeeResult") + +@NamedNativeQuery(name = "Schedules", + query = "SELECT * FROM schedule_days WHERE hourIn = 8", + resultSetMapping = "ScheduleResult") +@Entity +@Table(name = "SCHEDULE_DAYS") +public class ScheduledDay { + + @Id + @GeneratedValue + private Long id; + private Long employeeId; + private Integer hourIn; + private Integer hourOut; + private String dayOfWeek; + + public ScheduledDay() { + } + + public ScheduledDay(Long id, Long employeeId, Integer hourIn, Integer hourOut, String dayofWeek) { + this.id = id; + this.employeeId = employeeId; + this.hourIn = hourIn; + this.hourOut = hourOut; + this.dayOfWeek = dayofWeek; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getHourIn() { + return hourIn; + } + + public void setHourIn(Integer hourIn) { + this.hourIn = hourIn; + } + + public Integer getHourOut() { + return hourOut; + } + + public void setHourOut(Integer hourOut) { + this.hourOut = hourOut; + } + + public String getDayOfWeek() { + return dayOfWeek; + } + + public void setDayOfWeek(String dayOfWeek) { + this.dayOfWeek = dayOfWeek; + } +} diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..e9230eb6cd --- /dev/null +++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,23 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.sqlresultsetmapping.ScheduledDay + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/resources/database.sql b/persistence-modules/java-jpa/src/main/resources/database.sql new file mode 100644 index 0000000000..3310c79a85 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/resources/database.sql @@ -0,0 +1,19 @@ +CREATE TABLE EMPLOYEE +(id BIGINT, + name VARCHAR(10)); + +INSERT INTO EMPLOYEE VALUES (1, 'JOHN'); +INSERT INTO EMPLOYEE VALUES (2, 'MARY'); +INSERT INTO EMPLOYEE VALUES (3, 'FRANK'); + +CREATE TABLE SCHEDULE_DAYS +(id IDENTITY, + employeeId BIGINT, + hourIn int, + hourOut int, + dayOfWeek VARCHAR(10)); + +INSERT INTO SCHEDULE_DAYS (employeeId, hourIn, hourOut, dayOfWeek) VALUES (1, 13, 21, 'FRIDAY'); +INSERT INTO SCHEDULE_DAYS (employeeId, hourIn, hourOut, dayOfWeek) VALUES (2, 8, 4, 'SATURDAY'); +INSERT INTO SCHEDULE_DAYS (employeeId, hourIn, hourOut, dayOfWeek) VALUES (3, 8, 4, 'MONDAY'); +INSERT INTO SCHEDULE_DAYS (employeeId, hourIn, hourOut, dayOfWeek) VALUES (3, 8, 4, 'FRIDAY'); \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java new file mode 100644 index 0000000000..7f0cbd3c1d --- /dev/null +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.sqlresultsetmapping; + +import static org.junit.Assert.*; + +import org.junit.jupiter.api.*; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; +import java.util.Collections; +import java.util.List; + +public class SqlResultSetMappingUnitTest { + + private static EntityManager em; + private static EntityManagerFactory emFactory; + + @BeforeAll + public static void setup() { + emFactory = Persistence.createEntityManagerFactory("java-jpa-scheduled-day"); + em = emFactory.createEntityManager(); + } + + @Test + public void whenNamedQuery_thenColumnResult() { + List employeeIds = em.createNamedQuery("FridayEmployees").getResultList(); + assertEquals(2, employeeIds.size()); + } + + @Test + public void whenNamedQuery_thenConstructorResult() { + List scheduleDays = Collections.checkedList(em.createNamedQuery("Schedules", ScheduledDay.class).getResultList(), ScheduledDay.class); + assertEquals(3, scheduleDays.size()); + assertTrue(scheduleDays.stream().allMatch(c -> c.getHourIn().longValue() == 8)); + } + + @Test + public void whenNamedQuery_thenSingleEntityResult() { + List employees = Collections.checkedList(em.createNamedQuery("Employees").getResultList(), Employee.class); + assertEquals(3, employees.size()); + assertTrue(employees.stream().allMatch(c -> c.getClass() == Employee.class)); + } + + @Test + public void whenNamedQuery_thenMultipleEntityResult() { + final Query query = em.createNativeQuery("SELECT e.id, e.name, d.id, d.employeeId, " + + " d.dayOfWeek, d.hourIn, d.hourOut " + + " FROM employee e, schedule_days d " + + " WHERE e.id = d.employeeId", "EmployeeScheduleResults"); + List results = query.getResultList(); + assertEquals(4, results.size()); + assertTrue(results.get(0).length == 2); + + Employee emp = (Employee) results.get(1)[0]; + ScheduledDay day = (ScheduledDay) results.get(1)[1]; + + assertTrue(day.getEmployeeId() == emp.getId()); + } + + @AfterAll + public static void destroy() { + + if (em != null) { + em.close(); + } + if (emFactory != null) { + emFactory.close(); + } + } +} diff --git a/persistence-modules/java-jpa/src/test/resources/employees.sql b/persistence-modules/java-jpa/src/test/resources/employees.sql new file mode 100644 index 0000000000..feace36e2c --- /dev/null +++ b/persistence-modules/java-jpa/src/test/resources/employees.sql @@ -0,0 +1,3 @@ +INSERT INTO employee (1, "JOHN"); +INSERT INTO employee (2, "MARY"); +INSERT INTO employee (3, "FRANK"); \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/test/resources/scheduledDays.sql b/persistence-modules/java-jpa/src/test/resources/scheduledDays.sql new file mode 100644 index 0000000000..df1d4ed09e --- /dev/null +++ b/persistence-modules/java-jpa/src/test/resources/scheduledDays.sql @@ -0,0 +1,10 @@ +INSERT INTO SCHEDULE_DAYS (1, 13, 21, 'FRIDAY'); +INSERT INTO SCHEDULE_DAYS (2, 8, 4, 'SATURDAY'); +INSERT INTO SCHEDULE_DAYS (3, 8, 4, 'FRIDAY'); + + +-- private Long id; +-- private Long employeeId; +-- private Time in; +-- private Time out; +-- private DayOfWeek dayOfWeek; \ No newline at end of file