Spring Data JPA с QueryDSL, проблема с подсчетом с агрегатной функцией

Я использую Spring Data JPA с QueryDSL и пытаюсь использовать функцию Sum в условии, где я использую разбивку на страницы, поэтому мне нужно сначала получить счет. Итак, у меня есть код Java, как показано ниже: -

NumberPath<Double> path = entityPath.getNumber("qty", Double.class);
BooleanExpression exp = path.sum().loe(120);
JPQLQuery countQuery = from(stock).where(exp);
long count = countQuery.count();

его создание запроса выглядит следующим образом: -

select count(stock0_.stock_id) as col_0_0_ from stock stock0_
where sum(stock0_.qty)>=120;

и я получаю Error Code: 1111. Invalid use of group function.

вышеприведенный запрос также не работает в SQL, потому что функция суммы не может использоваться с условием подсчета. Я понятия не имею, как справиться с такой проблемой, когда мне нужно сначала подсчитать, а затем получить реальные данные. Может кто-нибудь, пожалуйста, помогите мне с тем, что такое JPA подход к решению такой проблемы.

Пожалуйста, не предлагайте аннотацию @Query, потому что я не могу ее использовать. Из-за необходимости динамической фильтрации.


person Anchit Pancholi    schedule 16.08.2016    source источник


Ответы (1)


arrow_upward
3
arrow_downward

Вы используете агрегатные функции (сумма). Тогда вам нужно иметь () вместо того, где ()

Этот пример действительно большой. Вам нужно только заботиться о нумерации страниц и наличии элементов.

Если у вас разные предикаты и объект pageRequest.

Пример запроса страницы:

pageRequest = new PageRequest(
                MI_PAGE,
                LIMIT,
                Sort.Direction.valueOf( ASC ),
                ORDER_FIELD);

EntityQ представляет метасущность, сгенерированную QueryDSL.

Пример запроса:

new JPAQuery(em).from(entityQ).where( entityQ.id.in(

        new JPASubQuery()
        .from(entity2Q).innerJoin(entity2Q.objEntityQ, entityQ)
            .where(ENTITY, PREDICATE)
            .groupBy(entity2Q.objEntityQ.id)
            .having( Wildcard.count.goe(SIZE) )
        .list(entity2Q.objEntityQ.id)

    ))
    .offset(pageRequest.getOffset() )
    .limit( pageRequest.getPageSize() )
    .orderBy(ORDERS).list(entityQ);

ИЗМЕНИТЬ 2 Подробнее для вашего примера:

У меня обычно есть контекст сохранения в моих пользовательских репозиториях:

@PersistenceContext
EntityManager em

Затем вы можете создать простой JPAQuery:

new JPAQuery(em)
.from(YOUR_STOCK_QUERYDSL_ENTITY)
.groupBy(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum)
.having(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum.sum().as("alias")
.goe(100));
person crm86    schedule 16.08.2016
comment
где sum(stock0_.qty)›=120 — групповая функция. Это должно работать со сравнением has() или использовать JPASubquery. - person crm86; 16.08.2016
comment
не могли бы вы объяснить мне подробно или предоставить любую ссылку. Как использовать это с pagable - person Anchit Pancholi; 16.08.2016
comment
Я использую класс Spring org.springframework.data.domain.Pagable для разбиения на страницы. выглядеть как приведенный выше пример с использованием двух разных таблиц. - person Anchit Pancholi; 16.08.2016
comment
Как я могу выполнить запрос ниже в querydsl: - select count(*) as count from (select count(stock0_.stock_id) as col_0_0_ from stock stock0_ having sum(stock0_.QTY)>=100) tbl; - person Anchit Pancholi; 16.08.2016
comment
Определенно, окончательная реализация запроса не является частью первого вопроса. Ваша ошибка была распространенным непониманием агрегации запросов в QueryDSL. Если возможно, отметьте ответ как действительный, если он был вам полезен. - person crm86; 16.08.2016
comment
Вы знаете, как выполнить вышеуказанный запрос с помощью querydsl? - person Anchit Pancholi; 16.08.2016