Я использую 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, потому что я не могу ее использовать. Из-за необходимости динамической фильтрации.
Ответ 1 · рейтинг 3 · crm86
Вы используете агрегатные функции (сумма). Тогда вам нужно иметь () вместо того, где ()
Этот пример действительно большой. Вам нужно только заботиться о нумерации страниц и наличии элементов.
Если у вас разные предикаты и объект 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));