Hibernate Group by Criteria Object Hibernate Group by Criteria Object sql sql

Hibernate Group by Criteria Object


Please refer to this for the example .The main point is to use the groupProperty() , and the related aggregate functions provided by the Projections class.

For example :

SELECT column_name, max(column_name) , min (column_name) , count(column_name)FROM table_nameWHERE column_name > xxxxxGROUP BY column_name

Its equivalent criteria object is :

List result = session.createCriteria(SomeTable.class)                           .add(Restrictions.ge("someColumn", xxxxx))                          .setProjection(Projections.projectionList()                            .add(Projections.groupProperty("someColumn"))                            .add(Projections.max("someColumn"))                            .add(Projections.min("someColumn"))                            .add(Projections.count("someColumn"))                               ).list();


GroupBy using in Hibernate

This is the resulting code

public Map getStateCounts(final Collection ids) {    HibernateSession hibernateSession = new HibernateSession();    Session session = hibernateSession.getSession();    Criteria criteria = session.createCriteria(DownloadRequestEntity.class)            .add(Restrictions.in("id", ids));    ProjectionList projectionList = Projections.projectionList();    projectionList.add(Projections.groupProperty("state"));    projectionList.add(Projections.rowCount());    criteria.setProjection(projectionList);    List results = criteria.list();    Map stateMap = new HashMap();    for (Object[] obj : results) {        DownloadState downloadState = (DownloadState) obj[0];        stateMap.put(downloadState.getDescription().toLowerCase() (Integer) obj[1]);    }    hibernateSession.closeSession();    return stateMap;}


You can use the approach @Ken Chan mentions, and add a single line of code after that if you want a specific list of Objects, example:

    session.createCriteria(SomeTable.class)                           .add(Restrictions.ge("someColumn", xxxxx))                          .setProjection(Projections.projectionList()                            .add(Projections.groupProperty("someColumn"))                            .add(Projections.max("someColumn"))                            .add(Projections.min("someColumn"))                            .add(Projections.count("someColumn"))                               ).setResultTransformer(Transformers.aliasToBean(SomeClazz.class));List<SomeClazz> objectList = (List<SomeClazz>) criteria.list();