JPA CriteriaBuilder Funktionen avg und sum ignorieren null Werte

Dieses Thema JPA - CriteriaBuilder Funktionen avg und sum ignorieren null Werte im Forum "Data Tier" wurde erstellt von forfaro, 5. Aug. 2014.

Thema: CriteriaBuilder Funktionen avg und sum ignorieren null Werte Hallo zusammen, ich benutze den CriteriaBuilder für eine Abfrage und habe dort die Einträge CriteriaBuilder cb...

  1. 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 das Java-Tutorial weiter. Hier klicken --> (Klick)