Zeitpunkt der Vergleich mit dem JPA criteria API

Bekam ich ein Angebot für die Datumsauswahl mit zwei Terminen: start und end, wo beide können leer sein. Ich möchte zum filtern einer Tabelle, in der die Entität hat genau einen Tag: date.

So, hier sind einige Beispiele. Ich möchte zu entsprechen. Imaging-das Datum entspricht dem aktuellen Datum (17/07/2016).

  • null - 17/07/2016 -> match
  • 17/07/2016 - null -> match
  • 17/07/2016 - 17/07/2016 -> match
  • null - null -> Spiel alle

Das sind die Grenzfälle, in meine Meinung und der Grund, warum ich kämpfen, so viel.

Eigentlich mein code sieht wie folgt aus:

CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Transaction> cq = cb.createQuery(Transaction.class);
Root<Transaction> root = cq.from(Transaction.class);

List<Predicate> predicates = new ArrayList<>();

Predicate startPredicate = cb.greaterThanOrEqualTo(root.get(Transaction_.date), start);
Predicate endPredicate = cb.greaterThanOrEqualTo(root.get(Transaction_.date), end);

predicates.add(startPredicate);
predicates.add(endPredicate);
cq.select(root).where(predicates.toArray(new Predicate[] {}));

TypedQuery<Transaction> query = getEm().createQuery(cq);
query.setFirstResult(firstRow);
query.setMaxResults(maxRow);
List<Transaction> resultList = query.getResultList();

Ich würde gerne eine Abfrage wie diese:

SELECT * FROM transaction
WHERE ((cast(date AS DATE) >= '2016-07-16' OR cast(date AS DATE) IS NULL))
       AND ((cast(date AS DATE) <= '2016-07-17' OR cast(date AS DATE) IS NULL))

Bitte beachten Sie: Die statische Datum ist die Simulation einer start-und end-Datum. und date ist die Tabelle, die Spalte.

Ich weiß, dass mein code falsch ist. Es entspricht nur reicht, ohne Berücksichtigung der null-Werte. Auch, wenn start und Ende ist am gleichen Tag, bekomme ich null Ergebnisse.

Hast du eine Idee? Wie Bearbeite ich mein code mit allen genannten Muster?

Bitte versuchen Sie es zu konstruieren, die die entsprechende SQL-Abfrage zunächst auf die back-end-Datenbank, die direkt produzieren das erwartete Ergebnis. Zum Beispiel, wollen Sie, um alle Zeilen zwischen dem start-Datum (inklusive / exklusive) und Enddatum (inclusive / exclusive) einschließlich der null-Werte in diesen Spalten wie SELECT * FROM table_name WHERE (cast(start_date AS DATE) > '07/17/2016' OR cast(start_date AS DATE) IS NULL) AND (cast(end_date AS DATE) < '07/20/2016' OR cast(end_date AS DATE) IS NULL) (oder mit der BETWEEN - Klausel)? Es wäre dann einfacher und klarer zu fertigen die entsprechenden Kriterien Abfrage.
Sorry mate, ich dachte nicht über diese option. In meinem Kopf war nur criteria-api, weil ich dachte, die Abfrage ist zu kompliziert (in meinem Kopf).Ihre Abfrage sieht soweit ganz gut aus. Ich fügte hinzu, ein update zu meiner Frage. Würden Sie mir einen Blick zu haben? 🙂

InformationsquelleAutor alexander | 2016-07-17

Schreibe einen Kommentar