JPA CriteriaBuilder Funktionen avg und sum ignorieren null Werte

forfaro

Mitglied
Hallo zusammen,
ich benutze den CriteriaBuilder für eine Abfrage und habe dort die Einträge

Java:
CriteriaBuilder cb  = em.getCriteriaBuilder();
CriteriaQuery<Object> query = cb.createQuery();
Root<Transaction> root = query.from(Transaction.class);

// ......
query.multiselect(root,
   cb.max(root.<Number>get("executionDate")),                 // 1
   cb.count(root),                                            // 2
   cb.avg(root.get("order").<Double>get("executedPrice")),    // 3
   cb.sum(root.get("order").<Double>get("executedAmount")),   // 4
   cb.sum(root.<Double>get("quantity")),                      // 5
   cb.avg(root.<Double>get("exchangeRate")),                  // 6
   cb.sum(root.get("order").<Double>get("transactionCosts"))
);

Die Transaction Klasse hat entsprechend Orders (root.get("order")), die aber nicht notwendigerweise gesetzt sind, also auch NULL sein können.

Die Abfrage gibt mir nun leider nur die Ergebnisse zurück, bei denen die Order nicht NULL ist (hier klappt alles super), die Ergebnisse mit Order = NULL ignoriert er. Wenn ich die Funktionen, die root.get("order") enthalten weglasse, kriege ich alle zurück (mit und ohne NULL Orders).

Ich habe jetzt schon versucht, den multiselect umzubauen in

Java:
query.multiselect(root,
   cb.max(root.<Number>get("executionDate")),                 // 1
   cb.count(root),                                            // 2
   cb.avg(cb.<Double>selectCase().when(root.get("order").isNull(), 0.0).otherwise(root.get("order").<Double>get("executedPrice"))),
   cb.sum(cb.<Double>selectCase().when(root.get("order").isNull(), 0.0).otherwise(root.get("order").<Double>get("executedAmount"))),
   cb.sum(root.<Double>get("quantity")),                      // 5
   cb.avg(root.<Double>get("exchangeRate")),                  // 6
   cb.sum(cb.<Double>selectCase().when(root.get("order").isNull(), 0.0).otherwise(root.get("order").<Double>get("transactionCosts")))
);

um die NULL Werte mit einzubeziehen, hat aber auch nichts gebracht.

Kann mir jemand helfen und sagen, wie ich die Abfrage bauen kann, dass sie auch die Zeilen zurück gibt, bei denen Order NULL ist?

Beste Grüße und Danke schon mal,
Forfaro
 

Ähnliche Java Themen


Oben