wake-up-neo.com

Ruhezustand nach Kriterien gruppieren Objekt

Ich möchte die folgende SQL-Abfrage mit Ruhezustand-Kriterien implementieren:

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

Ich habe versucht, dies mit Hibernate Criteria umzusetzen, aber es hat nicht geklappt.

Kann mir jemand ein Beispiel geben, wie dies mit den Kriterien für den Ruhezustand erreicht werden kann? Vielen Dank!

37
Bomberlatinos9

Das Beispiel finden Sie unter this . Der Hauptpunkt ist die Verwendung der groupProperty() und der zugehörigen Aggregatfunktionen, die von der Projections -Klasse bereitgestellt werden.

Beispielsweise :

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

Das äquivalente Kriterienobjekt ist:

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();
84
Ken Chan

GroupBy using in Hibernate

Dies ist der resultierende 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;
}
17
Ramkailash

Sie können den Ansatz verwenden, den @Ken Chan erwähnt, und anschließend eine einzelne Codezeile hinzufügen, wenn Sie eine bestimmte Liste von Objekten wünschen. Beispiel:

    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();
10
darkconeja