Счетчик результата группы Критерии гибернации по общему количеству сгруппированных записей - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть запрос на основе критериев со следующей группировкой:

Projections.projectionList()
    .add(Property.forName("xyz").group()));

Сгенерированный SQL (проприетарный, такой очищенный):

select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
    group by this_.XYZ

Теперь, концептуально, я хочу обернуть результаты запроса счетчиком (*) так, чтобы данные никогда не возвращались из базы данных, только счет. Как это:

select count(*) from (
  select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
      group by this_.XYZ
)

Могут быть тысячи строк, которые мне не нужны, и я заинтересован в высокой производительности, поэтому я не хочу, чтобы эти данные передавались по сети.

Мой критерий поиска имеет множество условий. Я не могу реально восстановить его, поэтому мне действительно нужно придерживаться критериев.

Добавление rowCount или count ("xyz"), конечно, не помогает, потому что он просто сообщает 1 для каждой строки.

В настоящее время я делаю это, чтобы получить счет:

ScrollableResults scroll = criteria.scroll();
scroll.last();
int count = scroll.getRowNumber();

Это работает, но требуется много времени, чтобы вернуться с подсчетом (на Oracle, если это имеет значение).

Могу ли я сделать то, что я предлагаю?

Ответы [ 2 ]

7 голосов
/ 14 сентября 2011

Концептуально,

select count(*) from (
  select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
      group by this_.XYZ
)

- это то же самое, что и

select count(distinct (this_.XYZ)) from FOO.BAR this_ WHERE [long where clause] 

. Таким образом, вы можете использовать Projections.countDistinct((String propertyName)) для выбора отдельного свойстваName для ваших критериев.

session.createCriteria(Foo.class)
        .add(myOrigianlCriterionObject)
        .setProjection(Projections.countDistinct("XYZ"));
0 голосов
/ 09 сентября 2013

Используйте Subqueries API и создайте внутренние критерии.

Первый критерий - это основной критерий, к которому относится группа. Количество строк берется из второго критерия 100% гарантированного результата.

Первые критерии

DetachedCriteria criteria = getNominationMainCriteria(nominationFilterDto, appraiserId);
        criteria.add(Property.forName(PROFFESIONAL_STRING + ".hcpId").eqProperty("subProf.hcpId"));
        criteria.setProjection(Projections.projectionList().add(
                Projections.groupProperty(PROFFESIONAL_STRING + "." + Constants.HCP_ID)));

Второй критерий

Criteria nativeCriteria = getSession().createCriteria(Professional.class, Constants.SUB_PROFESSIONAL);
        nativeCriteria.add(Subqueries.propertyEq(Constants.SUB_PROFESSIONAL + "." + Constants.HCP_ID, criteria));
        nativeCriteria.setProjection(Projections.projectionList().add(Projections.rowCount()));
        rowCount = (Long) nativeCriteria.uniqueResult();
...