HQL: группировка по месяцам - PullRequest
3 голосов
/ 29 мая 2009

Я пытаюсь сгруппировать по месяцам некоторые строки, используя HQL, но я немного новичок в этом API и, похоже, не могу заставить его работать.

Вот мой код:

        Criteria query = getHibernateSession().createCriteria(SalesPerformance.class);

        // summary report is grouped by date
        query.setProjection(Projections.projectionList().add(
                Projections.groupProperty("effectiveDate"), "effectiveDate").add(
                Projections.groupProperty("primaryKey.seller", "seller").add(
                Projections.sum("totalSales"))));


        // sub-select based on seller id
        query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
                "primaryKey.seller", FetchMode.SELECT);

        query.add(Property.forName("primaryKey.effectiveDate").le(new Date()));
        query.add(Property.forName("primaryKey.effectiveDate").ge(DateUtils.truncate(new Date(), Calendar.MONTH)));
        query.addOrder(Order.desc("primaryKey.effectiveDate"));

        return query.list();

Моя проблема с этим запросом состоит в том, что он будет возвращать одну строку в день, когда мне понадобится одна строка в месяц из-за Projection.groupProperty ("ffectiveDate ").

Я думал об использовании Projection.sqlGroupProjection вместо Projection.groupProperty и добавлял некоторый HQL, но документация и примеры, которые я нашел, не помогли мне понять, как я собираюсь поместить правильную инструкцию postresql в этот метод .

Кто-нибудь, кто знает о Postgres и HQL, может дать несколько советов, пожалуйста?

1 Ответ

6 голосов
/ 01 июня 2009

Нашли решение:

Criteria query = getHibernateSession().createCriteria(SalesPerformance.class);

    // summary report is grouped by date
            query.setProjection(Projections.projectionList().add(Projections.sqlGroupProjection("date_trunc('month', eff_dt) as eff_dt_value", "eff_dt_value", new String[] {"eff_dt_value"}, new Type[] {Hibernate.DATE})).add(
                            Projections.groupProperty("primaryKey.seller", "seller").add(
                            Projections.sum("totalSales"))));


            // sub-select based on seller id
            query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
                            "primaryKey.seller", FetchMode.SELECT);

            query.add(Property.forName("primaryKey.effectiveDate").le(new Date()));
            Date beginningOfLastMonth = DateUtils.truncate(DateUtils.addMonths(new Date(), -1) , Calendar.MONTH);
            Date endOfLastMonth = DateUtils.addDays(DateUtils.truncate(new Date(), Calendar.MONTH), -1);
            query.add(Property.forName("primaryKey.effectiveDate").between(beginningOfLastMonth, endOfLastMonth));


            return query.list();

Пожалуйста, обратите внимание, что в моем случае мне нужно получить значения сffectiveDate с прошлого месяца.

Надеюсь, это поможет другим в одной лодке! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...