Hibernate Named Native SQL Query
In this section, you will learn Named Native SQL Query in Hibernate.
Using HQL or criteria query in Hibernate, you can execute nearly any type of SQL query. Even so some developer complaint about slowness of statement generated by Hibernate and they opt to generate their own SQL statement. This explicitly generated query is known as Hibernate Native SQL Query.
In the Hibernate Named SQL query, we fetch the selected rows but the WHERE conditional values are passed through named variables as follows :
EXAMPLE
In the below example, we fetch the selected row from worker table using Named Native SQL Query in Hibernate.
The project hierarchy is given below :
The query for creating table worker is given below :
CREATE TABLE `worker` ( `worker_id` bigint(10) NOT NULL auto_increment, `firstname` varchar(50) default NULL, `lastname` varchar(50) default NULL, `birth_date` date NOT NULL, `cell_phone` varchar(15) NOT NULL, PRIMARY KEY (`worker_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CODE
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://192.168.10.13:3306/anky</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.pool_size">1</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">validate</property> <mapping class="net.roseindia.Worker"/> </session-factory> </hibernate-configuration>
Worker.java
package net.roseindia; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "worker") public class Worker { @Id @GeneratedValue @Column(name = "worker_id") private Long workerId; @Column(name = "firstname") private String firstname; @Column(name = "lastname") private String lastname; @Column(name = "birth_date") private Date birthDate; @Column(name = "cell_phone") private String cellphone; public Worker() { } public Worker(String firstname, String lastname, Date birthdate, String phone) { this.firstname = firstname; this.lastname = lastname; this.birthDate = birthdate; this.cellphone = phone; } public Long getWorkerId() { return workerId; } public void setWorkerId(Long workerId) { this.workerId = workerId; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public String getCellphone() { return cellphone; } public void setCellphone(String cellphone) { this.cellphone = cellphone; } }
HibernateNamedNativeSQLQuery.java
package net.roseindia; import java.util.Iterator; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateNamedNativeSQLQuery { private static SessionFactory sf; private static ServiceRegistry serviceRegistry; public static void main(String[] args) { try { Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings( configuration.getProperties()).buildServiceRegistry(); sf = configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } System.out.println("***Hibernate Named Native SQL Query Example***"); System.out.println("------------------------------------------------------"); Session session = sf.openSession(); try { session.beginTransaction(); String sql = "SELECT * FROM worker WHERE worker_id = :id"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(Worker.class); query.setParameter("id", 10); List workers = query.list(); for (Iterator iterator = workers.iterator(); iterator.hasNext();) { Worker worker = (Worker) iterator.next(); System.out.println("Worker Id:" + worker.getWorkerId()); System.out.println("Worker Name:" + worker.getFirstname()); System.out.println("Worker Birth Date:" + worker.getBirthDate()); System.out.println("Worker CellPhone No."+ worker.getCellphone()); System.out.println("-------------------------------------------------------"); } session.getTransaction().commit(); } catch (HibernateException e) { if (session.getTransaction() != null) session.getTransaction().rollback(); e.printStackTrace(); } finally { session.close(); } } }
OUTPUT
After execution, you will get the following result on console :
***Hibernate Named Native SQL Query Example*** ------------------------------------------------------ Hibernate: SELECT * FROM worker WHERE worker_id = ? Worker Id:10 Worker Name:Nayana Worker Birth Date:1987-06-30 00:00:00.0 Worker CellPhone No.919191919191 -------------------------------------------------------