CriteriaBuilder - 使用SelectCase求和

use*_*233 6 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;  
Run Code Online (Sandbox Code Playgroud)

使用来自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))  
Run Code Online (Sandbox Code Playgroud)

但是出现以下编译错误:

类型参数'N'的推断类型'java.lang.object'不在其范围内; 应该扩展'java.lang.number'

知道如何使用selectCase支持执行求和吗?

Mik*_*unu 11

总和定义如下:

<N extends Number> Expression<N> sum(Expression<N> x);
Run Code Online (Sandbox Code Playgroud)

因此编译错误的原因是sum方法期望这样的参数是Expression,其类型扩展了Number.它从selectCase中确定类型,最终得到java.lang.Object,这是不可接受的.

问题可以通过给出类型参数(<Number>)来解决:

criteriaBuilder.sum(
  criteriaBuilder.<Number>selectCase()
Run Code Online (Sandbox Code Playgroud)