Skip to content

Commit 93f54b1

Browse files
priyeshmashelkarjzheaux
authored andcommitted
BAEL-2814 Added files for article (eugenp#6968)
1 parent cb810de commit 93f54b1

7 files changed

Lines changed: 408 additions & 1 deletion

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.jpa.projections;
2+
3+
import java.math.BigDecimal;
4+
5+
import javax.persistence.Entity;
6+
import javax.persistence.GeneratedValue;
7+
import javax.persistence.GenerationType;
8+
import javax.persistence.Id;
9+
10+
@Entity
11+
public class Product {
12+
@Id
13+
private long id;
14+
private String name;
15+
private String description;
16+
private String category;
17+
private BigDecimal unitPrice;
18+
19+
public long getId() {
20+
return id;
21+
}
22+
public void setId(long id) {
23+
this.id = id;
24+
}
25+
public String getName() {
26+
return name;
27+
}
28+
public void setName(String name) {
29+
this.name = name;
30+
}
31+
public String getDescription() {
32+
return description;
33+
}
34+
public void setDescription(String description) {
35+
this.description = description;
36+
}
37+
public String getCategory() {
38+
return category;
39+
}
40+
public void setCategory(String category) {
41+
this.category = category;
42+
}
43+
public BigDecimal getUnitPrice() {
44+
return unitPrice;
45+
}
46+
public void setUnitPrice(BigDecimal unitPrice) {
47+
this.unitPrice = unitPrice;
48+
}
49+
50+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.baeldung.jpa.projections;
2+
3+
import java.util.List;
4+
5+
import javax.persistence.EntityManager;
6+
import javax.persistence.EntityManagerFactory;
7+
import javax.persistence.Persistence;
8+
import javax.persistence.Query;
9+
import javax.persistence.Tuple;
10+
import javax.persistence.criteria.CriteriaBuilder;
11+
import javax.persistence.criteria.CriteriaQuery;
12+
import javax.persistence.criteria.Root;
13+
14+
public class ProductRepository {
15+
private EntityManager entityManager;
16+
17+
public ProductRepository() {
18+
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-projections");
19+
entityManager = factory.createEntityManager();
20+
}
21+
22+
@SuppressWarnings("unchecked")
23+
public List<Object> findAllNamesUsingJPQL() {
24+
Query query = entityManager.createQuery("select name from Product");
25+
List<Object> resultList = query.getResultList();
26+
return resultList;
27+
}
28+
29+
@SuppressWarnings("unchecked")
30+
public List<Object> findAllIdsUsingJPQL() {
31+
Query query = entityManager.createQuery("select id from Product");
32+
List<Object> resultList = query.getResultList();
33+
return resultList;
34+
}
35+
36+
public List<String> findAllNamesUsingCriteriaBuilder() {
37+
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
38+
CriteriaQuery<String> query = builder.createQuery(String.class);
39+
Root<Product> product = query.from(Product.class);
40+
query.select(product.get("name"));
41+
List<String> resultList = entityManager.createQuery(query).getResultList();
42+
return resultList;
43+
}
44+
45+
@SuppressWarnings("unchecked")
46+
public List<Object[]> findAllIdAndNamesUsingJPQL() {
47+
Query query = entityManager.createQuery("select id, name from Product");
48+
List<Object[]> resultList = query.getResultList();
49+
return resultList;
50+
}
51+
52+
public List<Object[]> findAllIdAndNamesUsingCriteriaBuilderArray() {
53+
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
54+
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
55+
Root<Product> product = query.from(Product.class);
56+
query.select(builder.array(product.get("id"), product.get("name")));
57+
List<Object[]> resultList = entityManager.createQuery(query).getResultList();
58+
return resultList;
59+
}
60+
61+
public List<Object[]> findAllIdNameUnitPriceUsingCriteriaQueryMultiselect() {
62+
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
63+
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
64+
Root<Product> product = query.from(Product.class);
65+
query.multiselect(product.get("id"), product.get("name"), product.get("unitPrice"));
66+
List<Object[]> resultList = entityManager.createQuery(query).getResultList();
67+
return resultList;
68+
}
69+
70+
public List<Tuple> findAllIdAndNamesUsingCriteriaBuilderTuple() {
71+
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
72+
CriteriaQuery<Tuple> query = builder.createQuery(Tuple.class);
73+
Root<Product> product = query.from(Product.class);
74+
query.select(builder.tuple(product.get("id"), product.get("name")));
75+
List<Tuple> resultList = entityManager.createQuery(query).getResultList();
76+
return resultList;
77+
}
78+
79+
public List<Object[]> findCountByCategoryUsingJPQL() {
80+
Query query = entityManager.createQuery("select p.category, count(p) from Product p group by p.category");
81+
return query.getResultList();
82+
}
83+
84+
public List<Object[]> findCountByCategoryUsingCriteriaBuilder() {
85+
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
86+
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
87+
Root<Product> product = query.from(Product.class);
88+
query.multiselect(product.get("category"), builder.count(product));
89+
query.groupBy(product.get("category"));
90+
List<Object[]> resultList = entityManager.createQuery(query).getResultList();
91+
return resultList;
92+
}
93+
}

persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
148148
</properties>
149149
</persistence-unit>
150-
150+
151151
<persistence-unit name="jpa-entity-definition">
152152
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
153153
<class>com.baeldung.jpa.entity.Student</class>
@@ -163,4 +163,21 @@
163163
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
164164
</properties>
165165
</persistence-unit>
166+
167+
<persistence-unit name="jpa-projections">
168+
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
169+
<class>com.baeldung.jpa.projections.Product</class>
170+
<exclude-unlisted-classes>true</exclude-unlisted-classes>
171+
<properties>
172+
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
173+
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
174+
<property name="javax.persistence.jdbc.user" value="sa"/>
175+
<property name="javax.persistence.jdbc.password" value=""/>
176+
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
177+
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
178+
<property name="show_sql" value="true"/>
179+
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
180+
<property name="javax.persistence.sql-load-script-source" value="products_jpa.sql"/>
181+
</properties>
182+
</persistence-unit>
166183
</persistence>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
insert into product(id, name, description, category) values (1,'Product Name 1','This is Product 1', 'category1');
2+
insert into product(id, name, description, category) values (2,'Product Name 2','This is Product 2', 'category1');
3+
insert into product(id, name, description, category) values (3,'Product Name 3','This is Product 3', 'category2');
4+
insert into product(id, name, description, category) values (4,'Product Name 4','This is Product 4', 'category3');
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.baeldung.jpa.projections;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotNull;
5+
6+
import java.util.List;
7+
8+
import org.hibernate.Criteria;
9+
import org.hibernate.Session;
10+
import org.hibernate.SessionFactory;
11+
import org.hibernate.Transaction;
12+
import org.hibernate.cfg.AvailableSettings;
13+
import org.hibernate.cfg.Configuration;
14+
import org.hibernate.criterion.Order;
15+
import org.hibernate.criterion.Projections;
16+
import org.junit.After;
17+
import org.junit.Before;
18+
import org.junit.BeforeClass;
19+
import org.junit.Test;
20+
21+
public class HibernateProjectionsIntegrationTest {
22+
private static Session session;
23+
private static SessionFactory sessionFactory;
24+
private Transaction transaction;
25+
26+
@BeforeClass
27+
public static void init() {
28+
Configuration configuration = getConfiguration();
29+
configuration.addAnnotatedClass(Product.class);
30+
sessionFactory = configuration.buildSessionFactory();
31+
}
32+
33+
@Before
34+
public void before() {
35+
session = sessionFactory.getCurrentSession();
36+
transaction = session.beginTransaction();
37+
}
38+
39+
@After
40+
public void after() {
41+
if(transaction.isActive()) {
42+
transaction.rollback();
43+
}
44+
}
45+
46+
private static Configuration getConfiguration() {
47+
Configuration cfg = new Configuration();
48+
cfg.setProperty(AvailableSettings.DIALECT,
49+
"org.hibernate.dialect.H2Dialect");
50+
cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "none");
51+
cfg.setProperty(AvailableSettings.DRIVER, "org.h2.Driver");
52+
cfg.setProperty(AvailableSettings.URL,
53+
"jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1;;INIT=RUNSCRIPT FROM 'src/test/resources/products.sql'");
54+
cfg.setProperty(AvailableSettings.USER, "sa");
55+
cfg.setProperty(AvailableSettings.PASS, "");
56+
cfg.setProperty(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, "thread");
57+
return cfg;
58+
}
59+
60+
61+
@SuppressWarnings("deprecation")
62+
@Test
63+
public void givenProductData_whenIdAndNameProjectionUsingCriteria_thenListOfObjectArrayReturned() {
64+
Criteria criteria = session.createCriteria(Product.class);
65+
criteria = criteria.setProjection(Projections.projectionList()
66+
.add(Projections.id())
67+
.add(Projections.property("name")));
68+
List<Object[]> resultList = criteria.list();
69+
70+
assertNotNull(resultList);
71+
assertEquals(4, resultList.size());
72+
assertEquals(1L, resultList.get(0)[0]);
73+
assertEquals("Product Name 1", resultList.get(0)[1]);
74+
assertEquals(2L, resultList.get(1)[0]);
75+
assertEquals("Product Name 2", resultList.get(1)[1]);
76+
assertEquals(3L, resultList.get(2)[0]);
77+
assertEquals("Product Name 3", resultList.get(2)[1]);
78+
assertEquals(4L, resultList.get(3)[0]);
79+
assertEquals("Product Name 4", resultList.get(3)[1]);
80+
}
81+
82+
83+
@Test
84+
public void givenProductData_whenNameProjectionUsingCriteria_thenListOfStringReturned() {
85+
Criteria criteria = session.createCriteria(Product.class);
86+
criteria = criteria.setProjection(Projections.property("name"));
87+
List resultList = criteria.list();
88+
89+
assertNotNull(resultList);
90+
assertEquals(4, resultList.size());
91+
assertEquals("Product Name 1", resultList.get(0));
92+
assertEquals("Product Name 2", resultList.get(1));
93+
assertEquals("Product Name 3", resultList.get(2));
94+
assertEquals("Product Name 4", resultList.get(3));
95+
}
96+
97+
@Test
98+
public void givenProductData_whenCountByCategoryUsingCriteria_thenOK() {
99+
Criteria criteria = session.createCriteria(Product.class);
100+
criteria = criteria.setProjection(Projections.projectionList()
101+
.add(Projections.groupProperty("category"))
102+
.add(Projections.rowCount()));
103+
List<Object[]> resultList = criteria.list();
104+
105+
assertNotNull(resultList);
106+
assertEquals(3, resultList.size());
107+
assertEquals("category1", resultList.get(0)[0]);
108+
assertEquals(2L, resultList.get(0)[1]);
109+
assertEquals("category2", resultList.get(1)[0]);
110+
assertEquals(1L, resultList.get(1)[1]);
111+
assertEquals("category3", resultList.get(2)[0]);
112+
assertEquals(1L, resultList.get(2)[1]);
113+
}
114+
115+
@Test
116+
public void givenProductData_whenCountByCategoryWithAliasUsingCriteria_thenOK() {
117+
Criteria criteria = session.createCriteria(Product.class);
118+
criteria = criteria.setProjection(Projections.projectionList()
119+
.add(Projections.groupProperty("category"))
120+
.add(Projections.alias(Projections.rowCount(), "count")));
121+
criteria.addOrder(Order.asc("count"));
122+
List<Object[]> resultList = criteria.list();
123+
124+
assertNotNull(resultList);
125+
assertEquals(3, resultList.size());
126+
assertEquals("category2", resultList.get(0)[0]);
127+
assertEquals(1L, resultList.get(0)[1]);
128+
assertEquals("category3", resultList.get(1)[0]);
129+
assertEquals(1L, resultList.get(1)[1]);
130+
assertEquals("category1", resultList.get(2)[0]);
131+
assertEquals(2L, resultList.get(2)[1]);
132+
}
133+
}

0 commit comments

Comments
 (0)