2016-12-19 14 views
0

SelectCaseでこのCriteriaQueryを作成しようとしていますが、エラーが発生しています。これらは私の基準の変数です:モデルの属性をCriteriaのCASE WHEN JPAで集計する方法

CriteriaBuilder cb; 
CriteriaQuery cq; 
Root<Stransaction> transaction; 
Join<Stransaction, Customer> customerJoin; 
Join<Customer, Country> countryJoin; 
Join<Stransaction, Supplier> supplierJoin; 
Join<Stransaction, Productfamily> familyJoin; 

私のモデルでは、すべてがトランザクションID(国、サプライヤー、顧客、家族)に参加しています。

基準ですべてに参加した後、私が欲しいのはこれです(私は、これは顔にパフォーマンスのパンチで知って、私は後でそれを修正します、私はちょうど基準を学んでいる。):

SUM(CASE WHEN COUNTRY.COUNTRYNAME = :COUNTRYNAME THEN Transaction.CFR ELSE 0) 

しかし、この行は私にエラーを与えている:

selections.add(cb.sum(cb.<Number>selectCase().when(cb.equal(countryJoin.get("countryname"), country.getCountryname()), (Numeric)transaction.get("cfr")).otherwise(0))); 

Especificallyここ:

(Numeric)transaction.get("cfr") 

」それは可能性があるためNumericにキャストされる。 Transaction.cfrをselectCase()に送信するにはどうすればよいですか?

これは全体の方法である:。

private void generateSelect(FilterRegion filter) throws Exception 
    { 
     List<Country> countries = delegate.country().findAll(); 
     List<Selection<?>> selections = new LinkedList<>(); 

     if(filter.getContext() == FAMILY_CTX) 
     { 
      selections.add(familyJoin.get("prodfamname")); 
      cq.groupBy(familyJoin.get("prodfamname")); 
     } 
     else if(filter.getContext() == CUSTOMER_CTX){ 
      selections.add(customerJoin.get("customername")); 
      cq.groupBy(customerJoin.get("customername")); 
     } 
     else if(filter.getContext() == SUPPLIER_CTX){ 
      selections.add(supplierJoin.get("suppliername")); 
      cq.groupBy(supplierJoin.get("suppliername")); 
     } 

     for(Country country : countries) 
       selections.add(cb.sum(cb.<Number>selectCase().when(cb.equal(countryJoin.get("countryname"), country.getCountryname()), (Numeric)transaction.get("cfr")).otherwise(0))); 

     cq.multiselect(selections); 
    } 

答えて

0

transaction.get( "CFR")(Number.class)として

関連する問題