我有一个查询,该查询使用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)));