我正在尝试执行总结SQL查询,如下所示:
select group_ID, sum(case when user_type = 'Exec' then 1000
when user_type = 'Office' then 10 else 0 end)
from subscription
group by group_ID;
使用来自Hiberate CriteriaBuilder查询的以下代码段:
criteriaBuilder.sum(
criteriaBuilder.selectCase()
.when(criteriaBuilder.equal(subscriptionJoin.get(Subscription_.userType), "Exec"),1000)
.when(criteriaBuilder.equal(subscriptionJoin.get(Subscription_.userType), "Office"),1)
.otherwise(101))
但是出现以下编译错误:
类型参数'N'的推断类型'java.lang.object'不在其范围内;应该扩展'java.lang.number'
知道如何使用selectCase支持执行求和吗?
答案 0 :(得分:9)
总和定义如下:
<N extends Number> Expression<N> sum(Expression<N> x);
编译错误的原因是sum方法期望这样的参数是Expression,其类型扩展了Number。它从selectCase中确定类型,最终得到java.lang.Object,这是不可接受的。
通过提供类型参数(<Number>
)来解决问题:
criteriaBuilder.sum(
criteriaBuilder.<Number>selectCase()
答案 1 :(得分:1)
我们在项目中使用Spring Data JPA,我有相同的情况需要总结。而不是标准查询我只是遵循“命名参数”方法,因为这种方法似乎很容易。
给我总和的方法如下。
public interface ITransactionEntryRepo extends PagingAndSortingRepository<TransactionEntryEntity, String> {
@Query("select SUM(CASE WHEN te.debit = 'Y' THEN (te.amount * - 1) WHEN te.debit = 'N' THEN te.amount ELSE 0 END) AS availablebalance FROM TransactionEntity t, TransactionEntryEntity te WHERE t.id = te.transactionEntity.id and te.accountEntity.id = :id and te.valid = 'T' and t.retcode = 'XX' GROUP BY te.accountEntity.id")
public double findAvailableBalance(@Param("id") String id);
}
我在需要的课程中将此方法称为
double balance = iTransactionEntryRepo.findAvailableBalance(accountEntity.getId());
并在我需要的任何地方传递(平衡)。希望这有助于某人。