HQL Group By Clause Example

Group by clause is used to return the aggregate values by grouping on returned component. HQL supports Group By Clause. In our example we will calculate the count of students which have same subject. Here is the java code for calculating the count wise:

“SELECT student.course, COUNT(student.course) FROM Student student GROUP BY student.course” 


package com.sdnext.hibernate.tutorial.dto;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

public class Student implements Serializable 

  * serialVersionUID
 private static final long serialVersionUID = 8633415090390966715L;
 private int id;
 private String studentName;
 private int rollNumber;
 private String course;
 public int getId() {
  return id;
 public void setId(int id) {
  this.id = id;
 public String getStudentName() {
  return studentName;
 public void setStudentName(String studentName) {
  this.studentName = studentName;
 public int getRollNumber() {
  return rollNumber;
 public void setRollNumber(int rollNumber) {
  this.rollNumber = rollNumber;
 public String getCourse() {
  return course;
 public void setCourse(String course) {
  this.course = course;


<?xml version="1.0" encoding="UTF-8"?>

<?DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  <!-- Database connection settings -->
   <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
   <property name="connection.url">jdbc:mysql://localhost:3306/hibernateDB2</property> 
   <property name="connection.username">root</property> 
   <property name="connection.password">root</property> 

  <!-- JDBC connection pool (use the built-in) -->
   <property name="connection.pool_size">1</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 class="com.sdnext.hibernate.tutorial.dto.Student"/>


package com.sdnext.hibernate.tutorial;

import java.util.Iterator;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateTestDemo {
  * @param args
 public static void main(String[] args) 
  SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
  Session session = sessionFactory.openSession();
  String SQL_QUERY = "SELECT student.course, COUNT(student.course) FROM Student student GROUP BY student.course";
  Query query = session.createQuery(SQL_QUERY);
  for(Iterator it=query.iterate();it.hasNext();)
   Object[] row = (Object[]) it.next();
   System.out.print("Course Name: " + row[0]);
   System.out.println(" | Number of Students: " + row[1]);
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

Hibernate: select student0_.COURSE as col_0_0_, count(student0_.COURSE) as col_1_0_ from STUDENT student0_ group by student0_.COURSE
Course Name: BA | Number of Students: 2
Course Name: MA | Number of Students: 2
Course Name: MCA | Number of Students: 3
Course Name: PGDCP | Number of Students: 1

HQL Group By Clause Example