diff --git a/jpa/pom.xml b/jpa/pom.xml
new file mode 100644
index 0000000..9aef351
--- /dev/null
+++ b/jpa/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+
+
+ org.javaee8
+ samples-parent
+ 1.0-SNAPSHOT
+
+
+ jpa
+ pom
+ Java EE 8 Samples: JPA
+
+
+ stream
+
+
+
+
+ org.javaee8
+ test-utils
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/jpa/stream/pom.xml b/jpa/stream/pom.xml
new file mode 100644
index 0000000..910c3cb
--- /dev/null
+++ b/jpa/stream/pom.xml
@@ -0,0 +1,13 @@
+
+ 4.0.0
+
+
+ org.javaee8
+ jpa
+ 1.0-SNAPSHOT
+
+
+ stream
+ war
+ Java EE 8 Samples: JPA - Stream
+
diff --git a/jpa/stream/src/main/java/org/javaee8/jpa/stream/domain/Person.java b/jpa/stream/src/main/java/org/javaee8/jpa/stream/domain/Person.java
new file mode 100644
index 0000000..e6c1166
--- /dev/null
+++ b/jpa/stream/src/main/java/org/javaee8/jpa/stream/domain/Person.java
@@ -0,0 +1,52 @@
+package org.javaee8.jpa.stream.domain;
+
+import java.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ *
+ * @author Gaurav Gupta
+ *
+ */
+@Entity
+public class Person implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @Basic
+ private String name;
+
+ @Basic
+ private String address;
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return this.address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+}
\ No newline at end of file
diff --git a/jpa/stream/src/main/java/org/javaee8/jpa/stream/repository/PersonRepository.java b/jpa/stream/src/main/java/org/javaee8/jpa/stream/repository/PersonRepository.java
new file mode 100644
index 0000000..4eca1d5
--- /dev/null
+++ b/jpa/stream/src/main/java/org/javaee8/jpa/stream/repository/PersonRepository.java
@@ -0,0 +1,25 @@
+package org.javaee8.jpa.stream.repository;
+
+import java.util.stream.Stream;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaQuery;
+import org.javaee8.jpa.stream.domain.Person;
+
+/**
+ *
+ * @author Gaurav Gupta
+ *
+ */
+public class PersonRepository {
+
+ @PersistenceContext(unitName = "DEFAULT_PU")
+ private EntityManager em;
+
+ public Stream findAll() {
+ CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
+ cq.select(cq.from(Person.class));
+ return em.createQuery(cq).getResultStream();
+ }
+
+}
diff --git a/jpa/stream/src/test/java/org/javaee8/jpa/stream/controller/PersonControllerTest.java b/jpa/stream/src/test/java/org/javaee8/jpa/stream/controller/PersonControllerTest.java
new file mode 100644
index 0000000..54b0f75
--- /dev/null
+++ b/jpa/stream/src/test/java/org/javaee8/jpa/stream/controller/PersonControllerTest.java
@@ -0,0 +1,43 @@
+package org.javaee8.jpa.stream.controller;
+
+import java.util.stream.Stream;
+import org.javaee8.jpa.stream.repository.PersonRepository;
+import org.javaee8.jpa.stream.domain.Person;
+import javax.inject.Inject;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.junit.Test;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import static org.junit.Assert.assertEquals;
+import org.junit.runner.RunWith;
+
+/**
+ *
+ * @author Gaurav Gupta
+ *
+ */
+@RunWith(Arquillian.class)
+public class PersonControllerTest {
+
+ @Deployment
+ public static WebArchive createDeployment() {
+ return ShrinkWrap.create(WebArchive.class)
+ .addAsWebInfResource("beans.xml")
+ .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
+ .addAsResource("META-INF/sql/insert.sql")
+ .addClass(Person.class)
+ .addClass(PersonRepository.class);
+ }
+
+ @Inject
+ private PersonRepository personRepository;
+
+ @Test
+ public void testStream() throws Exception {
+ Stream personStream = personRepository.findAll();
+ long personCount = personStream.count();
+ assertEquals(2, personCount);
+ }
+
+}
diff --git a/jpa/stream/src/test/resources/META-INF/sql/insert.sql b/jpa/stream/src/test/resources/META-INF/sql/insert.sql
new file mode 100644
index 0000000..8be18f1
--- /dev/null
+++ b/jpa/stream/src/test/resources/META-INF/sql/insert.sql
@@ -0,0 +1,2 @@
+INSERT INTO person (id, name, address) VALUES (1002, 'Arjan', 'abc')
+INSERT INTO person (id, name, address) VALUES (1001, 'Gaurav', 'xyz')
diff --git a/jpa/stream/src/test/resources/beans.xml b/jpa/stream/src/test/resources/beans.xml
new file mode 100644
index 0000000..2777559
--- /dev/null
+++ b/jpa/stream/src/test/resources/beans.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/jpa/stream/src/test/resources/test-persistence.xml b/jpa/stream/src/test/resources/test-persistence.xml
new file mode 100644
index 0000000..6e1a33c
--- /dev/null
+++ b/jpa/stream/src/test/resources/test-persistence.xml
@@ -0,0 +1,11 @@
+
+
+
+ java:comp/DefaultDataSource
+ false
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index ef170ec..ed3a2f0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,6 +72,7 @@
servlet
jsf
cdi
+ jpa
jsonb
@@ -124,6 +125,13 @@
provided
+
+ org.eclipse.persistence
+ javax.persistence
+ 2.2.0-RC1
+ provided
+
+
javax.ws.rs
javax.ws.rs-api