Hibernate Criteria Query Tutorials with Examples using JPA 2
February 10, 2015
In this page we will learn Hibernate Criteria Query tutorials with examples using JPA 2. Hibernate suggest to use javax.persistence.criteria.CriteriaQuery instead of org.hibernate.Criteria. Here in this page we will provide different complete examples for CriteriaQuery. We will discuss typed and tuple both criteria query in our examples. To instantiate CriteriaQuery, we need javax.persistence.criteria.CriteriaBuilder. We will cover below points.
1. Fetch an Entity
2. Fetch One Column
3. Fetch Multiple Columns
4. Fetch Column Using Expression
5. Fetch Columns using Wrapper Class
6. Use Tuple to Fetch Columns
Contents
- Software Required to Run Examples
- Use JPA 2 javax.persistence.criteria.CriteriaQuery Class instead of Hibernate org.hibernate.Criteria
- Prepare Database
- build.gradle
- persistence.xml
- Hibernate Utility class to get CriteriaBuilder and EntityManager
- Entity Class used in Example
- Fetch an Entity
- Fetch One Column
- Fetch Multiple Columns
- Fetch Column Using Expression
- Fetch Columns using Wrapper Class
- Use Tuple to Fetch Columns
- Download Source Code
Software Required to Run Examples
Find the software to run examples.1. Java 6
2. Eclipse
3. Gradle
4. MySQL
Use JPA 2 javax.persistence.criteria.CriteriaQuery Class instead of Hibernate org.hibernate.Criteria
To use CriteriaQuery we have to follow below steps.1. Create persistence.xml to configure database configuration.
2. Fetch javax.persistence.criteria.CriteriaBuilder and javax.persistence.EntityManager by using javax.persistence.Persistence.createEntityManagerFactory().
3. Instantiate CriteriaQuery as CriteriaBuilder.createQuery() for typed criteria quires and CriteriaBuilder.createTupleQuery() for Tuple criteria query.
4. Use CriteriaQuery .select() and CriteriaQuery.multiselect() to select columns
5. Use CriteriaQuery.from() to assign entity name to fetch data.
6. Use CriteriaQuery.where() to apply condition for filtering the result.
7. Finally use EntityManager.createQuery() to create query and on its instance apply getResultList() or getSingleResult ()and get result.
Prepare Database
We are using MySQL for our demo. Find the schema.Table: student
CREATE TABLE `student` ( `id` INT(11) NULL DEFAULT NULL, `name` VARCHAR(50) NULL DEFAULT NULL, `age` INT(10) NULL DEFAULT NULL ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB;
build.gradle
Find the gradle file to resolve the required JAR.build.gradle
apply plugin: 'java' apply plugin: 'eclipse' archivesBaseName = 'hibernate-4' version = '1' repositories { mavenCentral() } dependencies { compile 'org.hibernate:hibernate-core:4.3.8.Final' compile 'org.hibernate:hibernate-entitymanager:4.3.6.Final' compile 'mysql:mysql-connector-java:5.1.34' }
persistence.xml
Find the persistence.xml in which we will do database configuration.persistence.xml
<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="com.concretepage"> <description>CriteriaQuery Demo</description> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.concretepage.pojo.Student</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/concretepage"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value=""/> </properties> </persistence-unit> </persistence>
Hibernate Utility class to get CriteriaBuilder and EntityManager
Find the utility class that will provide CriteriaBuilder and EntityManager.HibernateUtil.java
package com.concretepage.util; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.criteria.CriteriaBuilder; public class HibernateUtil { private static final EntityManagerFactory emFactory; static { emFactory = Persistence.createEntityManagerFactory("com.concretepage"); } public static CriteriaBuilder getCriteriaBuilder(){ CriteriaBuilder builder = emFactory.getCriteriaBuilder(); return builder; } public static EntityManager getEntityManager(){ return emFactory.createEntityManager(); } }
Entity Class used in Example
Find the student entity class which we are using for the demo.Student.java
package com.concretepage.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="student") public class Student { @Id @Column(name="id") private int id; @Column(name="age") private int age; @Column(name="name") private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Fetch an Entity
Find the example to fetch an entity with all columns. While instantiating CriteriaQuery , we need to pass entity class name.FetchEntity.java
package com.concretepage; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchEntity { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<Student> criteriaQuery = builder.createQuery(Student.class); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.select(studentRoot); criteriaQuery.where(builder.equal(studentRoot.get("name"),"Ram")); List<Student> students = em.createQuery(criteriaQuery).getResultList(); for ( Student student : students) { System.out.println("id:"+student.getId()+", age:"+student.getAge()); } } }
id:1, age:20 id:3, age:22
Fetch One Column
To fetch one column, instantiate CriteriaQuery with the data type of that column.FetchOneColumn.java
package com.concretepage; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchOneColumn { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<String> criteriaQuery = builder.createQuery(String.class); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.select(studentRoot.get("name").as(String.class)); criteriaQuery.where(builder.equal(studentRoot.get("age"),"22")); List<String> nameList = em.createQuery(criteriaQuery).getResultList(); for (String name : nameList) { System.out.println(name); } } }
Mahesh Ram
Fetch Multiple Columns
As we need more than one column, the object of CriteriaQuery will be created by passing Object[] array.FetchMultipleColumns.java
package com.concretepage; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchMultipleColumns { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.select(builder.array(studentRoot.get("id"),studentRoot.get("age"))); criteriaQuery.where(builder.equal(studentRoot.get("name"),"Ram")); List<Object[]> dataArray = em.createQuery(criteriaQuery).getResultList(); for (Object[] values : dataArray) { Integer id = (Integer) values[0]; Integer age = (Integer) values[1]; System.out.println("id:"+id+", age:"+age); } } }
id:1, age:20 id:3, age:22
Fetch Column Using Expression
To use expression while fetching column values, assign CriteriaQuery with the required data type and use CriteriaBuilder instance to get function like avg, max and min etc.FetchColumnWithExpression.java
package com.concretepage; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchColumnWithExpression { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<Integer> criteriaQuery = builder.createQuery(Integer.class); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.select(builder.max(studentRoot.get("age").as(Integer.class))); criteriaQuery.where(builder.equal(studentRoot.get("name"),"Ram")); Integer maxAge = em.createQuery(criteriaQuery).getSingleResult(); System.out.println("Max Age:"+ maxAge); } }
Max Age:22
Fetch Columns using Wrapper Class
We can use a wrapper class to fetch columns using CriteriaQuery. Instantiate CriteriaQuery by passing wrapper class name.FetchWrapper.java
package com.concretepage; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchWrapper { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<StudentWrapper> criteriaQuery = builder.createQuery(StudentWrapper.class); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.select(builder.construct(StudentWrapper.class, studentRoot.get("id"),studentRoot.get("age"))); criteriaQuery.where(builder.equal(studentRoot.get("name"),"Ram")); List<StudentWrapper> wrapperList = em.createQuery(criteriaQuery).getResultList(); for (StudentWrapper w : wrapperList) { int id = w.getId(); int age = w.getAge(); System.out.println("id:"+id+", age:"+age); } } }
StudentWrapper.java
package com.concretepage; public class StudentWrapper { private int id; private int age; public StudentWrapper(int id,int age){ this.id = id; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
id:1, age:20 id:3, age:22
Use Tuple to Fetch Columns
We can use Tuple class to fetch columns. Instantiate CriteriaQuery using CriteriaBuilder.createTupleQuery().FetchDataUsingTuple.java
package com.concretepage; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.concretepage.pojo.Student; import com.concretepage.util.HibernateUtil; public class FetchDataUsingTuple { public static void main(String[] args) { CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder(); EntityManager em = HibernateUtil.getEntityManager(); CriteriaQuery<Tuple> criteriaQuery = builder.createTupleQuery(); Root<Student> studentRoot = criteriaQuery.from(Student.class); criteriaQuery.multiselect(studentRoot.get("id"),studentRoot.get("age")); criteriaQuery.where(builder.equal(studentRoot.get("name"),"Ram")); List<Tuple> tupleList = em.createQuery(criteriaQuery).getResultList(); for (Tuple tuple : tupleList) { Integer id = (Integer)tuple.get(0); Integer age = (Integer)tuple.get(1); System.out.println("id:"+id+", age:"+age); } } }
id:1, age:20 id:3, age:22