Search code examples
postgresqlquerydsl

QueryDSL GroupBy and Sum


I have these QueryDSL statements:

BooleanExpression alwaysTrueExpression = match(null, null, datePeriod, period);

if (minAmount != null) {
    alwaysTrueExpression = alwaysTrueExpression.and(aggregatedOrder.totalUnitAmountWithoutTax.sum().goe(minAmount));
}
if (maxAmount != null) {
    alwaysTrueExpression = alwaysTrueExpression.and(aggregatedOrder.totalUnitAmountWithoutTax.sum().loe(maxAmount));
}

JPAQuery<AggregatedOrder> query = selectFrom(aggregatedOrder);
query = query.where(alwaysTrueExpression);
log.debug("sql={}", query);

return query.transform(GroupBy.groupBy(aggregatedOrder.tradingPromoterBranch.promoter).as(GroupBy.sum(aggregatedOrder.totalUnitAmountWithoutTax)));

But it throws the error:

Caused by: org.postgresql.util.PSQLException: ERROR: aggregate functions are not allowed in WHERE

I want to groupBy the aggregatedOrder by promoter and filter with amounts.


Solution

  • Here's how I aggregate the column and filter by sum:

    BooleanExpression alwaysTrueExpression = Expressions.asBoolean(true).isTrue();
    
    NumberExpression<BigDecimal> totalUnitAmountWithoutTax = aggregatedOrder.totalUnitAmountWithoutTax.sum();
    NumberExpression<Integer> totalQuantity = aggregatedOrder.quantity.sum();
    NumberPath<Long> qPromoter = aggregatedOrder.tradingPromoterBranch.promoter.id;
    
    BooleanExpression amountExpression = Expressions.asBoolean(true).isTrue();
    if (minAmount != null) {
        amountExpression = amountExpression.and(totalUnitAmountWithoutTax.goe(minAmount));
    }
    if (maxAmount != null) {
        amountExpression = amountExpression.and(totalUnitAmountWithoutTax.loe(maxAmount));
    }
    
    JPAQuery<Tuple> query = jpaQueryFactory.select(qPromoter, totalUnitAmountWithoutTax, totalQuantity).from(aggregatedOrder).groupBy(qPromoter);
    query = query.where(alwaysTrueExpression).having(amountExpression);
    
    return query.fetch();