diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.hbm.xml b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.hbm.xml
new file mode 100644
index 0000000000..9e0109aae2
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.hbm.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java
new file mode 100644
index 0000000000..b8b012c061
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java
@@ -0,0 +1,81 @@
+package com.baeldung.hibernate.criteria.model;
+
+import java.io.Serializable;
+
+public class Item implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private Integer itemId;
+ private String itemName;
+ private String itemDescription;
+ private Integer itemPrice;
+
+ // constructors
+ public Item() {
+
+ }
+
+ public Item(final Integer itemId, final String itemName, final String itemDescription) {
+ super();
+ this.itemId = itemId;
+ this.itemName = itemName;
+ this.itemDescription = itemDescription;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((itemId == null) ? 0 : itemId.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 Item other = (Item) obj;
+ if (itemId == null) {
+ if (other.itemId != null)
+ return false;
+ } else if (!itemId.equals(other.itemId))
+ return false;
+ return true;
+ }
+
+ public Integer getItemId() {
+ return itemId;
+ }
+
+ public void setItemId(final Integer itemId) {
+ this.itemId = itemId;
+ }
+
+ public String getItemName() {
+ return itemName;
+ }
+
+ public void setItemName(final String itemName) {
+ this.itemName = itemName;
+ }
+
+ public String getItemDescription() {
+ return itemDescription;
+ }
+
+ public Integer getItemPrice() {
+ return itemPrice;
+ }
+
+ public void setItemPrice(final Integer itemPrice) {
+ this.itemPrice = itemPrice;
+ }
+
+ public void setItemDescription(final String itemDescription) {
+ this.itemDescription = itemDescription;
+ }
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java
new file mode 100644
index 0000000000..57f32cfe50
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java
@@ -0,0 +1,20 @@
+package com.baeldung.hibernate.criteria.util;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+public class HibernateUtil {
+
+ @SuppressWarnings("deprecation")
+ public static Session getHibernateSession() {
+
+ final SessionFactory sf = new Configuration()
+ .configure("criteria.cfg.xml").buildSessionFactory();
+
+ // factory = new Configuration().configure().buildSessionFactory();
+ final Session session = sf.openSession();
+ return session;
+ }
+
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java
new file mode 100644
index 0000000000..4db94f2ad7
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java
@@ -0,0 +1,253 @@
+/**
+ * ApplicationViewer is the class that starts the application
+ * First it creates the session object and then creates the
+ * criteria query.
+ *
+ * @author Pritam Banerjee
+ * @version 1.0
+ * @since 07/20/2016
+ */
+
+package com.baeldung.hibernate.criteria.view;
+
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.LogicalExpression;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+
+import com.baeldung.hibernate.criteria.model.Item;
+import com.baeldung.hibernate.criteria.util.HibernateUtil;
+
+public class ApplicationView {
+
+ // default Constructor
+ public ApplicationView() {
+
+ }
+
+ public boolean checkIfCriteriaTimeLower() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ Transaction tx = null;
+
+ // calculate the time taken by criteria
+ final long startTimeCriteria = System.nanoTime();
+ cr.add(Restrictions.like("itemName", "%item One%"));
+ final List results = cr.list();
+ final long endTimeCriteria = System.nanoTime();
+ final long durationCriteria = (endTimeCriteria - startTimeCriteria) / 1000;
+
+ // calculate the time taken by HQL
+ final long startTimeHQL = System.nanoTime();
+ tx = session.beginTransaction();
+ final List items = session.createQuery("FROM Item where itemName like '%item One%'").list();
+ final long endTimeHQL = System.nanoTime();
+ final long durationHQL = (endTimeHQL - startTimeHQL) / 1000;
+
+ if (durationCriteria > durationHQL) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ // To get items having price more than 1000
+ public String[] greaterThanCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.gt("itemPrice", 1000));
+ final List- greaterThanItemsList = cr.list();
+ final String greaterThanItems[] = new String[greaterThanItemsList.size()];
+ for (int i = 0; i < greaterThanItemsList.size(); i++) {
+ greaterThanItems[i] = greaterThanItemsList.get(i).getItemName();
+ }
+ session.close();
+ return greaterThanItems;
+ }
+
+ // To get items having price less than 1000
+ public String[] lessThanCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.lt("itemPrice", 1000));
+ final List
- lessThanItemsList = cr.list();
+ final String lessThanItems[] = new String[lessThanItemsList.size()];
+ for (int i = 0; i < lessThanItemsList.size(); i++) {
+ lessThanItems[i] = lessThanItemsList.get(i).getItemName();
+ }
+ session.close();
+ return lessThanItems;
+ }
+
+ // To get items whose Name start with Chair
+ public String[] likeCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.like("itemName", "%chair%"));
+ final List
- likeItemsList = cr.list();
+ final String likeItems[] = new String[likeItemsList.size()];
+ for (int i = 0; i < likeItemsList.size(); i++) {
+ likeItems[i] = likeItemsList.get(i).getItemName();
+ }
+ session.close();
+ return likeItems;
+ }
+
+ // Case sensitive search
+ public String[] likeCaseCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.ilike("itemName", "%Chair%"));
+ final List
- ilikeItemsList = cr.list();
+ final String ilikeItems[] = new String[ilikeItemsList.size()];
+ for (int i = 0; i < ilikeItemsList.size(); i++) {
+ ilikeItems[i] = ilikeItemsList.get(i).getItemName();
+ }
+ session.close();
+ return ilikeItems;
+ }
+
+ // To get records having itemPrice in between 100 and 200
+ public String[] betweenCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ // To get items having price more than 1000
+ cr.add(Restrictions.between("itemPrice", 100, 200));
+ final List
- betweenItemsList = cr.list();
+ final String betweenItems[] = new String[betweenItemsList.size()];
+ for (int i = 0; i < betweenItemsList.size(); i++) {
+ betweenItems[i] = betweenItemsList.get(i).getItemName();
+ }
+ session.close();
+ return betweenItems;
+ }
+
+ // To check if the given property is null
+ public String[] nullCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.isNull("itemDescription"));
+ final List
- nullItemsList = cr.list();
+ final String nullDescItems[] = new String[nullItemsList.size()];
+ for (int i = 0; i < nullItemsList.size(); i++) {
+ nullDescItems[i] = nullItemsList.get(i).getItemName();
+ }
+ session.close();
+ return nullDescItems;
+ }
+
+ // To check if the given property is not null
+ public String[] notNullCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.isNotNull("itemDescription"));
+ final List
- notNullItemsList = cr.list();
+ final String notNullDescItems[] = new String[notNullItemsList.size()];
+ for (int i = 0; i < notNullItemsList.size(); i++) {
+ notNullDescItems[i] = notNullItemsList.get(i).getItemName();
+ }
+ session.close();
+ return notNullDescItems;
+ }
+
+ // Adding more than one expression in one cr
+ public String[] twoCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.add(Restrictions.isNull("itemDescription"));
+ cr.add(Restrictions.like("itemName", "chair%"));
+ final List
- notNullItemsList = cr.list();
+ final String notNullDescItems[] = new String[notNullItemsList.size()];
+ for (int i = 0; i < notNullItemsList.size(); i++) {
+ notNullDescItems[i] = notNullItemsList.get(i).getItemName();
+ }
+ session.close();
+ return notNullDescItems;
+ }
+
+ // To get items matching with the above defined conditions joined
+ // with Logical AND
+ public String[] andLogicalCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ final Criterion greaterThanPrice = Restrictions.gt("itemPrice", 1000);
+ final Criterion chairItems = Restrictions.like("itemName", "Chair%");
+ final LogicalExpression andExample = Restrictions.and(greaterThanPrice, chairItems);
+ cr.add(andExample);
+ final List
- andItemsList = cr.list();
+ final String andItems[] = new String[andItemsList.size()];
+ for (int i = 0; i < andItemsList.size(); i++) {
+ andItems[i] = andItemsList.get(i).getItemName();
+ }
+ session.close();
+ return andItems;
+ }
+
+ // To get items matching with the above defined conditions joined
+ // with Logical OR
+ public String[] orLogicalCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ final Criterion greaterThanPrice = Restrictions.gt("itemPrice", 1000);
+ final Criterion chairItems = Restrictions.like("itemName", "Chair%");
+ final LogicalExpression orExample = Restrictions.or(greaterThanPrice, chairItems);
+ cr.add(orExample);
+ final List
- orItemsList = cr.list();
+ final String orItems[] = new String[orItemsList.size()];
+ for (int i = 0; i < orItemsList.size(); i++) {
+ orItems[i] = orItemsList.get(i).getItemName();
+ }
+ session.close();
+ return orItems;
+ }
+
+ // Sorting example
+ public String[] sortingCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final Criteria cr = session.createCriteria(Item.class);
+ cr.addOrder(Order.asc("itemName"));
+ cr.addOrder(Order.desc("itemPrice")).list();
+ final List
- sortedItemsList = cr.list();
+ final String sortedItems[] = new String[sortedItemsList.size()];
+ for (int i = 0; i < sortedItemsList.size(); i++) {
+ sortedItems[i] = sortedItemsList.get(i).getItemName();
+ }
+ session.close();
+ return sortedItems;
+ }
+
+ // Set projections Row Count
+ public Long[] projectionRowCount() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List itemProjected = session.createCriteria(Item.class).setProjection(Projections.rowCount())
+ .list();
+ final Long projectedRowCount[] = new Long[itemProjected.size()];
+ for (int i = 0; i < itemProjected.size(); i++) {
+ projectedRowCount[i] = itemProjected.get(i);
+ }
+ session.close();
+ return projectedRowCount;
+ }
+
+ // Set projections average of itemPrice
+ public Double[] projectionAverage() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List avgItemPriceList = session.createCriteria(Item.class)
+ .setProjection(Projections.projectionList().add(Projections.avg("itemPrice"))).list();
+
+ final Double avgItemPrice[] = new Double[avgItemPriceList.size()];
+ for (int i = 0; i < avgItemPriceList.size(); i++) {
+ avgItemPrice[i] = (Double) avgItemPriceList.get(i);
+ }
+ session.close();
+ return avgItemPrice;
+ }
+
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.hbm.xml b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.hbm.xml
new file mode 100644
index 0000000000..e0b6516b47
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.hbm.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java
new file mode 100644
index 0000000000..19ed36eceb
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java
@@ -0,0 +1,73 @@
+package com.baeldung.hibernate.fetching.model;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+public class OrderDetail implements Serializable{
+
+ private static final long serialVersionUID = 1L;
+ private Long orderId;
+ private Date orderDate;
+ private String orderDesc;
+ private User user;
+
+ public OrderDetail(){
+
+ }
+
+ public OrderDetail(Date orderDate, String orderDesc) {
+ super();
+ this.orderDate = orderDate;
+ this.orderDesc = orderDesc;
+ }
+
+ public Date getOrderDate() {
+ return orderDate;
+ }
+ public void setOrderDate(Date orderDate) {
+ this.orderDate = orderDate;
+ }
+ public String getOrderDesc() {
+ return orderDesc;
+ }
+ public void setOrderDesc(String orderDesc) {
+ this.orderDesc = orderDesc;
+ }
+ public User getUser() {
+ return user;
+ }
+ public void setUser(User user) {
+ this.user = user;
+ }
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((orderId == null) ? 0 : orderId.hashCode());
+ return result;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OrderDetail other = (OrderDetail) obj;
+ if (orderId == null) {
+ if (other.orderId != null)
+ return false;
+ } else if (!orderId.equals(other.orderId))
+ return false;
+
+ return true;
+ }
+ public Long getOrderId() {
+ return orderId;
+ }
+ public void setOrderId(Long orderId) {
+ this.orderId = orderId;
+ }
+
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.hbm.xml b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.hbm.xml
new file mode 100644
index 0000000000..88882b973e
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.hbm.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.java
new file mode 100644
index 0000000000..eb98b7d0f9
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/User.java
@@ -0,0 +1,96 @@
+package com.baeldung.hibernate.fetching.model;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class User implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private Long userId;
+ private String userName;
+ private String firstName;
+ private String lastName;
+ private Set orderDetail = new HashSet();
+
+ public User() {
+
+ }
+
+ public User(final Long userId, final String userName, final String firstName, final String lastName) {
+ super();
+ this.userId = userId;
+ this.userName = userName;
+ this.firstName = firstName;
+ this.lastName = lastName;
+
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((userId == null) ? 0 : userId.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 other = (User) obj;
+ if (userId == null) {
+ if (other.userId != null)
+ return false;
+ } else if (!userId.equals(other.userId))
+ return false;
+ return true;
+ }
+
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(final Long userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(final String userName) {
+ this.userName = userName;
+ }
+
+ 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 Set getOrderDetail() {
+ return orderDetail;
+ }
+
+ public void setOrderDetail(Set orderDetail) {
+ this.orderDetail = orderDetail;
+ }
+
+
+
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.hbm.xml b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.hbm.xml
new file mode 100644
index 0000000000..2f941fe8b0
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.hbm.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java
new file mode 100644
index 0000000000..c6b095dde2
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java
@@ -0,0 +1,35 @@
+package com.baeldung.hibernate.fetching.util;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+public class HibernateUtil {
+ private static SessionFactory factory;
+
+ @SuppressWarnings("deprecation")
+ public static Session getHibernateSession(String fetchMethod) {
+ //two config files are there
+ //one with lazy loading enabled
+ //another lazy = false
+ SessionFactory sf = null;
+ if ("lazy".equals(fetchMethod)) {
+ sf = new Configuration().configure("fetchingLazy.cfg.xml").buildSessionFactory();
+ } else {
+
+ sf = new Configuration().configure("fetching.cfg.xml").buildSessionFactory();
+ }
+ // fetching.cfg.xml is used for this example
+ final Session session = sf.openSession();
+ return session;
+ }
+
+ public static Session getHibernateSession() {
+ System.out.println("Loading eager");
+ SessionFactory sf = null;
+ sf = new Configuration().configure("fetching.cfg.xml").buildSessionFactory();
+ final Session session = sf.openSession();
+ return session;
+ }
+
+}
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
new file mode 100644
index 0000000000..5e4ab32d03
--- /dev/null
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
@@ -0,0 +1,115 @@
+package com.baeldung.hibernate.fetching.view;
+
+import java.sql.Date;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+
+import com.baeldung.hibernate.fetching.util.HibernateUtil;
+
+import com.baeldung.hibernate.fetching.model.OrderDetail;
+
+import com.baeldung.hibernate.fetching.model.User;
+
+
+public class FetchingAppView {
+
+ public FetchingAppView(){
+
+ }
+
+ //lazily loaded
+ public boolean lazyLoaded(){
+ final Session sessionLazy = HibernateUtil.getHibernateSession("lazy");
+ List users = sessionLazy.createQuery("From User").list();
+ User userLazyLoaded = new User();
+ userLazyLoaded = users.get(3);
+ //since data is lazyloaded so data won't be initialized
+ Set orderDetailSet = userLazyLoaded.getOrderDetail();
+ return (Hibernate.isInitialized(orderDetailSet));
+ }
+
+ //eagerly loaded
+ public boolean eagerLoaded(){
+ final Session sessionEager = HibernateUtil.getHibernateSession();
+ //data should be loaded in the following line
+ //also note the queries generated
+ List users =sessionEager.createQuery("From User").list();
+ User userEagerLoaded = new User();
+ userEagerLoaded = users.get(3);
+ Set orderDetailSet = userEagerLoaded.getOrderDetail();
+ return (Hibernate.isInitialized(orderDetailSet));
+ }
+
+
+ //creates test data
+ //call this method to create the data in the database
+ public void createTestData() {
+
+ final Session session = HibernateUtil.getHibernateSession();
+
+ Transaction tx = null;
+
+ tx = session.beginTransaction();
+ final User user1 = new User();
+ final User user2 = new User();
+ final User user3 = new User();
+
+ user1.setFirstName("Priyam");
+ user1.setLastName("Banerjee");
+ user1.setUserName("priyambanerjee");
+ session.save(user1);
+
+ user2.setFirstName("Navneeta");
+ user2.setLastName("Mukherjee");
+ user2.setUserName("nmukh");
+ session.save(user2);
+
+ user3.setFirstName("Molly");
+ user3.setLastName("Banerjee");
+ user3.setUserName("mollyb");
+ session.save(user3);
+
+ final OrderDetail order1 = new OrderDetail();
+ final OrderDetail order2 = new OrderDetail();
+ final OrderDetail order3 = new OrderDetail();
+ final OrderDetail order4 = new OrderDetail();
+ final OrderDetail order5 = new OrderDetail();
+
+ order1.setOrderDesc("First Order");
+ order1.setOrderDate(new Date(2014, 10, 12));
+ order1.setUser(user1);
+
+ order2.setOrderDesc("Second Order");
+ order2.setOrderDate(new Date(2016, 10, 25));
+ order2.setUser(user1);
+
+ order3.setOrderDesc("Third Order");
+ order3.setOrderDate(new Date(2015, 2, 17));
+ order3.setUser(user2);
+
+ order4.setOrderDesc("Fourth Order");
+ order4.setOrderDate(new Date(2014, 10, 1));
+ order4.setUser(user2);
+
+ order5.setOrderDesc("Fifth Order");
+ order5.setOrderDate(new Date(2014, 9, 11));
+ order5.setUser(user3);
+
+
+ session.saveOrUpdate(order1);
+ session.saveOrUpdate(order2);
+ session.saveOrUpdate(order3);
+ session.saveOrUpdate(order4);
+ session.saveOrUpdate(order5);
+
+ // session.saveOrUpdate(user1);
+ tx.commit();
+ session.close();
+
+ }
+}
diff --git a/spring-hibernate4/src/main/resources/criteria.cfg.xml b/spring-hibernate4/src/main/resources/criteria.cfg.xml
new file mode 100644
index 0000000000..a39a32e151
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/criteria.cfg.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ com.mysql.jdbc.Driver
+ jdbc:mysql://localhost:3306/test
+ root
+ iamtheking
+ org.hibernate.dialect.MySQLDialect
+ true
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/criteria_create_queries.sql b/spring-hibernate4/src/main/resources/criteria_create_queries.sql
new file mode 100644
index 0000000000..3a627dd38c
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/criteria_create_queries.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `item` (
+ `ITEM_ID` int(11) NOT NULL AUTO_INCREMENT,
+ `ITEM_DESC` varchar(100) DEFAULT NULL,
+ `ITEM_PRICE` int(11) NOT NULL,
+ `ITEM_NAME` varchar(255) NOT NULL,
+ PRIMARY KEY (`ITEM_ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
diff --git a/spring-hibernate4/src/main/resources/fetching.cfg.xml b/spring-hibernate4/src/main/resources/fetching.cfg.xml
new file mode 100644
index 0000000000..1595c829cd
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/fetching.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ com.mysql.jdbc.Driver
+ jdbc:mysql://localhost:3306/test
+ root
+ iamtheking
+ org.hibernate.dialect.MySQLDialect
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml b/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml
new file mode 100644
index 0000000000..4c64b4deb6
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ com.mysql.jdbc.Driver
+ jdbc:mysql://localhost:3306/test
+ root
+ iamtheking
+ org.hibernate.dialect.MySQLDialect
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/fetching_create_queries.sql b/spring-hibernate4/src/main/resources/fetching_create_queries.sql
new file mode 100644
index 0000000000..11a4239e0d
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/fetching_create_queries.sql
@@ -0,0 +1,19 @@
+CREATE TABLE `user` (
+ `user_id` int(10) NOT NULL AUTO_INCREMENT,
+ `USERNAME` varchar(100) DEFAULT NULL,
+ `FIRST_NAME` varchar(255) NOT NULL,
+ `LAST_NAME` varchar(255) NOT NULL,
+ PRIMARY KEY (`user_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 ;
+
+
+CREATE TABLE `user_order` (
+ `ORDER_ID` int(10) NOT NULL AUTO_INCREMENT,
+ `ORDER_DATE` date DEFAULT NULL,
+ `USER_ID` int(10) NOT NULL DEFAULT '0',
+ `ORDER_DESC` varchar(1024) DEFAULT NULL,
+ PRIMARY KEY (`ORDER_ID`,`USER_ID`),
+ KEY `USER_ID` (`USER_ID`),
+ CONSTRAINT `user_order_ibfk_1` FOREIGN KEY (`USER_ID`) REFERENCES `USER` (`user_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
+
diff --git a/spring-hibernate4/src/main/resources/insert_statements.sql b/spring-hibernate4/src/main/resources/insert_statements.sql
new file mode 100644
index 0000000000..ae008f29bc
--- /dev/null
+++ b/spring-hibernate4/src/main/resources/insert_statements.sql
@@ -0,0 +1,31 @@
+insert into item (item_id, item_name, item_desc, item_price)
+values(1,'item One', 'test 1', 35.12);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(2,'Pogo stick', 'Pogo stick', 466.12);
+insert into item (item_id, item_name, item_desc, item_price)
+values(3,'Raft', 'Raft', 345.12);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(4,'Skate Board', 'Skating', 135.71);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(5,'Umbrella', 'Umbrella for Rain', 619.25);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(6,'Glue', 'Glue for home', 432.73);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(7,'Paint', 'Paint for Room', 1311.40);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(8,'Red paint', 'Red paint for room', 1135.71);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(9,'Household Chairs', 'Chairs for house', 25.71);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(10,'Office Chairs', 'Chairs for office', 395.98);
+
+insert into item (item_id, item_name, item_desc, item_price)
+values(11,'Outdoor Chairs', 'Chairs for outdoor activities', 1234.36);
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTest.java
new file mode 100644
index 0000000000..3bd8c5ee00
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTest.java
@@ -0,0 +1,191 @@
+package com.baeldung.hibernate.criteria;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.junit.Test;
+
+import com.baeldung.hibernate.criteria.model.Item;
+import com.baeldung.hibernate.criteria.util.HibernateUtil;
+import com.baeldung.hibernate.criteria.view.ApplicationView;
+
+public class HibernateCriteriaTest {
+
+ final private ApplicationView av = new ApplicationView();
+
+ @Test
+ public void testPerformanceOfCriteria() {
+ assertTrue(av.checkIfCriteriaTimeLower());
+ }
+
+ @Test
+ public void testLikeCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedLikeList = session.createQuery("From Item where itemName like '%chair%'").list();
+ final String expectedLikeItems[] = new String[expectedLikeList.size()];
+ for (int i = 0; i < expectedLikeList.size(); i++) {
+ expectedLikeItems[i] = expectedLikeList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedLikeItems, av.likeCriteria());
+ }
+
+ @Test
+ public void testILikeCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedChairCaseList = session.createQuery("From Item where itemName like '%Chair%'").list();
+ final String expectedChairCaseItems[] = new String[expectedChairCaseList.size()];
+ for (int i = 0; i < expectedChairCaseList.size(); i++) {
+ expectedChairCaseItems[i] = expectedChairCaseList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedChairCaseItems, av.likeCaseCriteria());
+
+ }
+
+ @Test
+ public void testNullCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedIsNullDescItemsList = session.createQuery("From Item where itemDescription is null")
+ .list();
+ final String expectedIsNullDescItems[] = new String[expectedIsNullDescItemsList.size()];
+ for (int i = 0; i < expectedIsNullDescItemsList.size(); i++) {
+ expectedIsNullDescItems[i] = expectedIsNullDescItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedIsNullDescItems, av.nullCriteria());
+ }
+
+ @Test
+ public void testIsNotNullCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedIsNotNullDescItemsList = session
+ .createQuery("From Item where itemDescription is not null").list();
+ final String expectedIsNotNullDescItems[] = new String[expectedIsNotNullDescItemsList.size()];
+ for (int i = 0; i < expectedIsNotNullDescItemsList.size(); i++) {
+ expectedIsNotNullDescItems[i] = expectedIsNotNullDescItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedIsNotNullDescItems, av.notNullCriteria());
+
+ }
+
+ @Test
+ public void testAverageProjection() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List expectedAvgProjItemsList = session.createQuery("Select avg(itemPrice) from Item item")
+ .list();
+
+ final Double expectedAvgProjItems[] = new Double[expectedAvgProjItemsList.size()];
+ for (int i = 0; i < expectedAvgProjItemsList.size(); i++) {
+ expectedAvgProjItems[i] = expectedAvgProjItemsList.get(i);
+ }
+ session.close();
+ assertArrayEquals(expectedAvgProjItems, av.projectionAverage());
+
+ }
+
+ @Test
+ public void testRowCountProjection() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List expectedCountProjItemsList = session.createQuery("Select count(*) from Item").list();
+ final Long expectedCountProjItems[] = new Long[expectedCountProjItemsList.size()];
+ for (int i = 0; i < expectedCountProjItemsList.size(); i++) {
+ expectedCountProjItems[i] = expectedCountProjItemsList.get(i);
+ }
+ session.close();
+ assertArrayEquals(expectedCountProjItems, av.projectionRowCount());
+ }
+
+ @Test
+ public void testOrCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedOrCritItemsList = session
+ .createQuery("From Item where itemPrice>1000 or itemName like 'Chair%'").list();
+ final String expectedOrCritItems[] = new String[expectedOrCritItemsList.size()];
+ for (int i = 0; i < expectedOrCritItemsList.size(); i++) {
+ expectedOrCritItems[i] = expectedOrCritItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedOrCritItems, av.orLogicalCriteria());
+ }
+
+ @Test
+ public void testAndCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedAndCritItemsList = session
+ .createQuery("From Item where itemPrice>1000 and itemName like 'Chair%'").list();
+ final String expectedAndCritItems[] = new String[expectedAndCritItemsList.size()];
+ for (int i = 0; i < expectedAndCritItemsList.size(); i++) {
+ expectedAndCritItems[i] = expectedAndCritItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedAndCritItems, av.andLogicalCriteria());
+ }
+
+ @Test
+ public void testMultiCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedMultiCritItemsList = session
+ .createQuery("From Item where itemDescription is null and itemName like'chair%'").list();
+ final String expectedMultiCritItems[] = new String[expectedMultiCritItemsList.size()];
+ for (int i = 0; i < expectedMultiCritItemsList.size(); i++) {
+ expectedMultiCritItems[i] = expectedMultiCritItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedMultiCritItems, av.twoCriteria());
+ }
+
+ @Test
+ public void testSortCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedSortCritItemsList = session
+ .createQuery("From Item order by itemName asc, itemPrice desc").list();
+ final String expectedSortCritItems[] = new String[expectedSortCritItemsList.size()];
+ for (int i = 0; i < expectedSortCritItemsList.size(); i++) {
+ expectedSortCritItems[i] = expectedSortCritItemsList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedSortCritItems, av.sortingCriteria());
+ }
+
+ @Test
+ public void testGreaterThanCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedGreaterThanList = session.createQuery("From Item where itemPrice>1000").list();
+ final String expectedGreaterThanItems[] = new String[expectedGreaterThanList.size()];
+ for (int i = 0; i < expectedGreaterThanList.size(); i++) {
+ expectedGreaterThanItems[i] = expectedGreaterThanList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedGreaterThanItems, av.greaterThanCriteria());
+ }
+
+ @Test
+ public void testLessThanCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedLessList = session.createQuery("From Item where itemPrice<1000").list();
+ final String expectedLessThanItems[] = new String[expectedLessList.size()];
+ for (int i = 0; i < expectedLessList.size(); i++) {
+ expectedLessThanItems[i] = expectedLessList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedLessThanItems, av.lessThanCriteria());
+ }
+
+ @Test
+ public void betweenCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedBetweenList = session.createQuery("From Item where itemPrice between 100 and 200")
+ .list();
+ final String expectedPriceBetweenItems[] = new String[expectedBetweenList.size()];
+ for (int i = 0; i < expectedBetweenList.size(); i++) {
+ expectedPriceBetweenItems[i] = expectedBetweenList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedPriceBetweenItems, av.betweenCriteria());
+ }
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java
new file mode 100644
index 0000000000..8341df9fcb
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java
@@ -0,0 +1,15 @@
+package com.baeldung.hibernate.criteria;
+
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+public class HibernateCriteriaTestRunner {
+
+ public static void main(final String[] args) {
+ Result result = JUnitCore.runClasses(HibernateCriteriaTestSuite.class);
+ for (Failure failure : result.getFailures()) {
+
+ }
+ }
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestSuite.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestSuite.java
new file mode 100644
index 0000000000..ab27a6ba82
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestSuite.java
@@ -0,0 +1,11 @@
+package com.baeldung.hibernate.criteria;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({ HibernateCriteriaTest.class })
+
+public class HibernateCriteriaTestSuite {
+
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTest.java
new file mode 100644
index 0000000000..94ee8a3c79
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.hibernate.fetching;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.baeldung.hibernate.fetching.view.FetchingAppView;
+
+public class HibernateFetchingTest {
+
+ @Test
+ public void testLazyFetching() {
+ FetchingAppView fav = new FetchingAppView();
+ fav.createTestData();
+ assertFalse(fav.lazyLoaded());
+ }
+
+ @Test
+ public void testEagerFetching() {
+ FetchingAppView fav = new FetchingAppView();
+ assertTrue(fav.eagerLoaded());
+ }
+
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestRunner.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestRunner.java
new file mode 100644
index 0000000000..82cf7acc40
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestRunner.java
@@ -0,0 +1,17 @@
+package com.baeldung.hibernate.fetching;
+
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+public class HibernateFetchingTestRunner {
+
+ public static void main(final String[] args) {
+
+ Result result = JUnitCore.runClasses(HibernateFetchingTestSuite.class);
+ for (Failure failure : result.getFailures()) {
+
+ }
+
+ }
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestSuite.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestSuite.java
new file mode 100644
index 0000000000..b3f0aea620
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingTestSuite.java
@@ -0,0 +1,11 @@
+package com.baeldung.hibernate.fetching;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({ HibernateFetchingTest.class })
+public class HibernateFetchingTestSuite {
+
+}
diff --git a/spring-hibernate4/src/test/java/criteria.cfg.xml b/spring-hibernate4/src/test/java/criteria.cfg.xml
new file mode 100644
index 0000000000..653b5a188a
--- /dev/null
+++ b/spring-hibernate4/src/test/java/criteria.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ com.mysql.jdbc.Driver
+ jdbc:mysql://localhost:3306/test
+ root
+ iamtheking
+ org.hibernate.dialect.MySQLDialect
+ true
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/test/java/hibernate.cfg.xml b/spring-hibernate4/src/test/java/hibernate.cfg.xml
deleted file mode 100644
index 2167eada16..0000000000
--- a/spring-hibernate4/src/test/java/hibernate.cfg.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-com.mysql.jdbc.Driver
-jdbc:mysql://localhost:3306/HIBERTEST2_TEST
-root
-
-
-
-1
-
-
-org.hibernate.dialect.MySQLDialect
-
-
-thread
-
-
-org.hibernate.cache.internal.NoCacheProvider
-
-
-true
-
-
-
-
-
-
-