2017-03-17 4 views
0

Ich habe aufgegeben, es herauszufinden, also frage ich hier :) Mein Ziel ist es, einige Daten in der Datenbank-Abfrage von CriteriaBuilder zu filtern. Jede Client hat Felder wie howMuchOrders und orderTotalValue.Persistence CriteriaBuilder - überprüfen, ob größer als 0

Hier versuche ich zu überprüfen, ob mein gegeben atLeastAverageValue niedriger als averageTotalValueExpression (berechnet durch orderTotalValue durch howMuchOrders Teilung). Am Anfang muss ich überprüfen, ob meine atLeastAverageValue nicht null ist. Andernfalls möchte ich kein Prädikat zur Liste der ausgeführten Prädikate mit Abfrage hinzufügen.

Alles funktioniert gut, bis root.get("orderCount") gibt Null (was möglich ist) und es wirft org.springframework.dao.DataIntegrityViolationException. Ich könnte diese Ausnahme fangen und behandeln, aber es ist nicht die Art, wie ich es machen möchte. Zunächst möchte ich überprüfen, ob der Wert in root.get("orderCount") nicht null ist. Wenn es nicht ist - berechnen und add prediacte Prädikatsliste. Ansonsten nichts tun.

private void addMaxAveragePredicate(BigDecimal atLeastAverageValue, List<Predicate> predicates, CriteriaBuilder builder, Root<?> root) { 
    if (atLeastAverageValue!=null) { 
      Expression averageTotalValueExpression = builder.quot(root.get("orderCount"), root.get("orderTotalValue")).as(BigDecimal.class); 
      predicates.add(builder.lessThanOrEqualTo(averageTotalValueExpression, atLeastAverageValue)); 

    } 
} 

Kann jemand helfen?

Antwort

0

Die Lösung gefunden! Ich konnte nicht herausfinden, ob der Wert größer als 0 ist, wie in if Anweisung, aber ich stellte mir vor, wie die SQL-Abfrage aussehen würde. Ich brauchte nur, wenn orderCount > 0 und orderValue/order in logischen AND zu überprüfen :) sieht wie folgt aus:

predicates.add(builder.and(builder.greaterThan(root.get("orderCount"), 0), 
builder.lessThanOrEqualTo(exQuot, attValue))); 

ich brauchte nur etwas Zeit :)

Verwandte Themen