Я пытаюсь создать этот CriteriaQuery с помощью SelectCase, но получаю сообщение об ошибке. Это мои переменные Критерии:Как получить атрибут модели с помощью 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;
В моей модели все соединено с транзакцией через идентификаторы (страна, поставщик, клиент, семья).
После присоединения все с критериями, что я хочу это (я знаю, что это выступление удар в лицо, я починю его позже я только учусь Criteria.):
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")
Потому что может» t be cast to 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);
}