CriteriaBuilder - 使用SelectCase求和

时间:2012-07-12 23:48:10

标签: criteria-api

我正在尝试执行总结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支持执行求和吗?

2 个答案:

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

并在我需要的任何地方传递(平衡)。希望这有助于某人。