hibernate criteria Distinct Result Example


 

hibernate criteria Distinct Result Example

In This example search the result according to Criteria Restriction and like condition. The DISTINCT_ROOT_ENTITY field is ensures that each row of results is a distinct instance of the root entity.

In This example search the result according to Criteria Restriction and like condition. The DISTINCT_ROOT_ENTITY field is ensures that each row of results is a distinct instance of the root entity.

hibernate criteria Distinct Result Example

In this Example, We will discuss about hibernate criteria query, In this example we create a criteria instance and implement the factory methods for obtaining certain built-in Criterion types method. In This example search the result according to Criteria Restriction  and like condition. The DISTINCT_ROOT_ENTITY field is ensures that each row of results is a distinct instance of the root entity.

Here is the simple Example code files.

CriteriaDistincExample.java

package roseindia;

import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import roseindia.bean.User;
import roseindia.util.HibernateUtil;

public class CriteriaDistincExample {

	public static void main(String[] args) {

		Session session = HibernateUtil.getSessionFactory().openSession();

		User user = null;

		try {
			// Creating a Criteria instance
			Criteria crit = session.createCriteria(User.class);
			crit.add(Restrictions.like("empName", "Gyan%"));
			crit.add(Restrictions.gt("expInMonth", 50));
			crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
			List list = crit.list();
			Iterator itr = list.iterator();
			while (itr.hasNext()) {
			user = (User) itr.next();
			System.out.println("EmpId: " + user.getEmpId());
			System.out.printf("\t");
			System.out.println("EmpName: " + user.getEmpName());
			System.out.printf("\t");
			System.out.println("EmpAddr: " + user.getEmpAddr());
			System.out.printf("\t");
			System.out.println("ExpInMonth: " + user.getExpInMonth());

			}

		} catch (HibernateException e) {

			e.printStackTrace();
		} finally {
			session.close();
		}

	}

}

The bean class is as follows.

package roseindia.bean;

import java.util.Date;

public class User implements java.io.Serializable {

	private static final long serialVersionUID = 1L;

	private long Id = 0;
	private int empId = 0;
	private String empName = null;
	private String empAddr = null;
	private String empPhone = null;
	private String empEmail = null;
	private Date empDOB = null;
	private int expInMonth = 0;
	private double empSalary = 0.0;

	public User() {
	}

	public User(int empId ,String empName, String empAddr, String empPhone,
		String empEmail, Date empDOB, int expInMonth, double empSalary) {
		this.empId=empId;
		this.empName = empName;
		this.empAddr = empAddr;
		this.empPhone = empPhone;
		this.empEmail = empEmail;
		this.empDOB = empDOB;
		this.expInMonth = expInMonth;
		this.empSalary = empSalary;
	}

	public long getId() {
		return Id;
	}

	public void setId(long id) {
		Id = id;
	}

	public int getEmpId() {
		return empId;
	}

	public void setEmpId(int empId) {
		this.empId = empId;
	}

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public String getEmpAddr() {
		return empAddr;
	}

	public void setEmpAddr(String empAddr) {
		this.empAddr = empAddr;
	}

	public String getEmpPhone() {
		return empPhone;
	}

	public void setEmpPhone(String empPhone) {
		this.empPhone = empPhone;
	}

	public String getEmpEmail() {
		return empEmail;
	}

	public void setEmpEmail(String empEmail) {
		this.empEmail = empEmail;
	}

	public Date getEmpDOB() {
		return empDOB;
	}

	public void setEmpDOB(Date empDOB) {
		this.empDOB = empDOB;
	}

	public int getExpInMonth() {
		return expInMonth;
	}

	public void setExpInMonth(int expInMonth) {
		this.expInMonth = expInMonth;
	}

	public double getEmpSalary() {
		return empSalary;
	}

	public void setEmpSalary(double empSalary) {
		this.empSalary = empSalary;
	}

	@Override
	public String toString() {
		return "User [empAddr=" + empAddr + ", empDOB=" + empDOB
		+ ", empEmail=" + empEmail + ", empId=" + empId + ", empName="
		+ empName + ", empPhone=" + empPhone + ", empSalary="
		+ empSalary + ", expInMonth=" + expInMonth + "]";
	}

}

We use the following code to insert the values in the database table using mapping file.

DataInsert.java

package roseindia;

import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import roseindia.bean.User;
import roseindia.util.HibernateUtil;

public class DataInsert {

	public static void main(String[] args) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		User user = null;

		try {
			transaction = session.beginTransaction();
			for (int i = 0; i < 10; i++) {
				user = new User( 1 * i,"Gyan " + i, "NEW DELHI" + i,
				"68784654654" + i, "[email protected]" + i, new Date(),
						12 * i, 15398.00 * i);
				session.save(user);
			}
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}

	}

}

The database table mapping is in the file User.hbm.xml and hibernate configuration file is hibernate.cfg.xml.

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">10</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="roseindia/bean/User.hbm.xml" />

</session-factory>

</hibernate-configuration>

The User.hbm.xml file is as follows-

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="roseindia.bean.User" table="EMPLOYEE">
<id name="Id" type="long" column="ID">
<generator class="native" />
</id>
<property name="empId" type="int" length="100" not-null="false"
column="EMP_ID" />
<property name="empName" type="java.lang.String" length="100"
not-null="false" column="EMP_NAME" />
<property name="empAddr" type="java.lang.String" length="100"
not-null="false" column="EMP_ADDR" />
<property name="empPhone" type="java.lang.String" length="100"
not-null="false" column="EMP_PHONE" />
<property name="empEmail" type="java.lang.String" length="100"
not-null="false" column="EMP_EMAIL" />
<property name="empDOB" type="java.util.Date" not-null="false"
column="EMP_DOB" />
<property name="expInMonth" type="int" not-null="false"
column="EXP_IN_MONTH" />
<property name="empSalary" type="double" not-null="false"
column="EMP_SALARY" />

</class>
</hibernate-mapping>

The HibernateUtil.java is as follows, is used to get the SessionFactory object to open session.

package roseindia.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	static {
		try {
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		} catch (Throwable ex) {
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

This example give the output the values from the table according to the criteria defined.

The structure of the database table is as follows:

The resultant query generated by hibernate is as follows which produces the output as follows

Hibernate: select this_.ID as ID0_0_, this_.EMP_ID as EMP2_0_0_, this_.EMP_NAME as 
EMP3_0_0_, this_.EMP_ADDR as EMP4_0_0_, this_.EMP_PHONE as EMP5_0_0_, 
this_.EMP_EMAIL as EMP6_0_0_, this_.EMP_DOB as EMP7_0_0_, this_.EXP_IN_MONTH as 
EXP8_0_0_, this_.EMP_SALARY as EMP9_0_0_ from EMPLOYEE this_ where this_.EMP_NAME
 like ? and this_.EXP_IN_MONTH>?

Download Source Code

Ads