7

我正在尝试执行汇总 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;  

使用来自休眠 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 执行求和吗?

4

2 回答 2

16

Sum 定义如下:

<N extends Number> Expression<N> sum(Expression<N> x);

所以编译错误的原因是 sum 方法期望这样的参数是表达式,其类型扩展了 Number。它从 selectCase 中确定类型并以 java.lang.Object 结束,这是不可接受的。

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

criteriaBuilder.sum(
  criteriaBuilder.<Number>selectCase()
于 2012-07-17T19:35:49.637 回答
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());

并将它(平衡)传递到我需要的任何地方。希望这可以帮助某人。

于 2016-02-22T20:56:36.977 回答