代码之家  ›  专栏  ›  技术社区  ›  czetsuya

QueryDSL GroupBy和Sum

  •  0
  • czetsuya  · 技术社区  · 7 年前

    我有这些QueryDSL声明:

    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)));
    

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

    我想按发起人的聚合顺序进行分组,并使用金额进行筛选。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Piotr Ponikowski    7 年前

    我认为您混合了Querydsl支持的两种分组类型:

    • groupBy(…):将groupBy子句添加到查询中。在这种情况下,分组由数据库执行。

    如果查询中需要聚合函数,则需要使用“query.groupBy(…)”提供“groupBy”列。

        2
  •  1
  •   czetsuya    7 年前

    下面是我如何聚合列并按总和筛选:

    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();