Спящая группа по критерию Объект - PullRequest
37 голосов
/ 13 декабря 2011

Я хотел бы реализовать следующий SQL-запрос с критериями Hibernate:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name <operator> value
GROUP BY column_name

Я пытался реализовать это с помощью Hibernate Criteria, но это не сработало.

Может кто-нибудь привести пример, как это можно сделать с помощью Hibernate Criteria? Спасибо!

Ответы [ 3 ]

83 голосов
/ 13 декабря 2011

Пожалуйста, обратитесь к this для примера. Главное - использовать groupProperty() и связанные с ним агрегатные функции, предоставляемые классом Projection .

Например:

SELECT column_name, max(column_name) , min (column_name) , count(column_name)
FROM table_name
WHERE column_name > xxxxx
GROUP BY column_name

Его эквивалентный объект критерия:

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();
17 голосов
/ 05 июля 2014

GroupBy использует в Hibernate

Это результирующий код

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;
}
10 голосов
/ 24 декабря 2015

Вы можете использовать подход, о котором упоминает @Ken Chan, и добавить одну строку кода после этого, если вам нужен определенный список объектов, например:

    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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...