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)


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

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

Если у вас разные предикаты и объект 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