JPA CriteriaBuilder Funktionen avg und sum ignorieren null Werte

Diskutiere CriteriaBuilder Funktionen avg und sum ignorieren null Werte im Data Tier Forum; Hallo zusammen, ich benutze den CriteriaBuilder für eine Abfrage und habe dort die Einträge CriteriaBuilder cb = em.getCriteriaBuilder();...

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

    Code (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

    Code (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
     
  2. Vielleicht hilft dir dieser Kurs hier weiter --> (hier klicken)
Die Seite wird geladen...

CriteriaBuilder Funktionen avg und sum ignorieren null Werte - Ähnliche Themen

CriteriaBuilder: Werte übergeben
CriteriaBuilder: Werte übergeben im Forum Data Tier
Funktionen aus anderen Klassen benutzen
Funktionen aus anderen Klassen benutzen im Forum Java Basics - Anfänger-Themen
funktionen der super-klasse von der super-klasse
funktionen der super-klasse von der super-klasse im Forum Java Basics - Anfänger-Themen
Kalender mit Sonderfunktionen
Kalender mit Sonderfunktionen im Forum Allgemeine Java-Themen
lineare funktionen und winkel
lineare funktionen und winkel im Forum Allgemeine Java-Themen
Thema: CriteriaBuilder Funktionen avg und sum ignorieren null Werte