如果使用CriteriaBuilder在表达式不为0的情况下可以将表达式相乘?

时间:2018-08-21 13:03:24

标签: java persistence criteria

我有一个查询,该查询使用CriteriaBuilder获取交易数据。 Transacton数量乘以其符号。

如果eSign表达式为0,是否可以排除乘法?

我的查询:

CriteriaBuilder            builder = em.getCriteriaBuilder();
CriteriaQuery<Transaction> query   = builder.createQuery(Transaction.class);
Root<Transaction>          from    = query.from(Transaction.class);

Expression<TxType>     eTxType = from.get(Transaction_.transactionType);
Expression<BigDecimal> eAmount = from.get(Transaction_.amount);
Expression<Integer>    eSign   = from.get(Transaction_.sign);

Expression<BigDecimal> productAmountAndSign = builder.prod(eAmount, eSign.as(BigDecimal.class));

// other predicates
// ...

query.multiselect(eTxType, builder.sum(productAmountAndSign));
query.groupBy(eTxType);

TypedQuery<Transaction> typedQuery = em.createQuery(query);
List<Transaction>       transactions = typedQuery.getResultList();

更新:发现在Oracle中可以做到这一点:

SELECT transactiontype,
   SUM(CASE WHEN sign = 0 THEN amount ELSE sign*amount END) AS sum
FROM transactions
GROUP BY transactiontype;

只需要找到一种使用CriteriaBuilder的方法即可。

解决方案:

Expression<BigDecimal> productAmountAndSign = builder
      .<BigDecimal>selectCase()
      .when(builder.equal(eSign, 0), eAmount)
      .otherwise(builder.prod(eAmount, eSign.as(BigDecimal.class)));

0 个答案:

没有答案
相关问题