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