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

合計は次のように定義されます。

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

したがって、コンパイル エラーの理由は、sum メソッドが Number を拡張する型の Expression であるような引数を期待していることです。これは 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 に答える