If/Case-Anweisung in JPA Criteria Builder
Möchte ich den Aufbau einer Abfrage die Suche nach Daten auf verschiedenen entites. Meine Struktur ist:
- Vertrag Datum (nicht nullable)
- Arbeitnehmer Datum (nicht nullable)
- Mitarbeiter kann eine Vertrags-id (nullable)
Wenn ein Mitarbeiter einen Vertrag, den ich abrufen möchten, Tag des Vertragsschlusses. Wenn ein Mitarbeiter nicht über einen Vertrag, dann möchte ich zu dem zurückkehren des Mitarbeiters Datum.
Mein code bisher ist:
if (inputDate!= null) {
ParameterExpression<Date> exp = criteriaBuilder.parameter(Date.class, "inputDate");
criteria.add(criteriaBuilder.or(
criteriaBuilder.isNull(employee.get("contract")),
criteriaBuilder.lessThanOrEqualTo(employee.<Date>get("creationDate"), exp), criteriaBuilder.lessThanOrEqualTo((employee.join("contract").<Date>get("fromDate")), exp) ));}
Scheint dies nicht zu funktionieren. Ich habe immer scheinen zu gehen, in der isNull-von denen ich nicht erwarten.
Ich bin gerne in diese einige mehr, aber ich denke, meine Frage ist, ob dies der richtige Weg zu gehen über es. Ist es? Ich habe gesehen, dass selectCase als auch in criteriaBuilder so vielleicht, das vielleicht die bessere Lösung.
Alle Zeiger würde stark empfangen werden.
Dank
InformationsquelleAutor RNJ | 2012-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier wäre eine Lösung, nicht sicher, ob es funktioniert, aber wir werden es hinbekommen, es funktioniert mit deiner Hilfe :):
Ich verstehe nicht, warum "inputDate" als Ausdruck statt ein Datum? Auch schlage ich die Umbenennung
criteria
zuc
undcriteriaBuilder
zucb
, das würde Platz sparen und ich denke, es ist bequemer.Ich denke, was wir tun müssen ist, vergleichen Sie das Datum mit dem Datum in der Case-Anweisung.
InformationsquelleAutor JMelnik
Ich denke, was Sie tun möchten, verwenden Sie
Case<Date>
, und verwenden SiePredicate
nur als erstes argument aufCase#when
.Case<Date>
ist einExpression<Date>
, das ist, was Sie wollen, gehen inCriteriaQuery#multiselect
.InformationsquelleAutor Patrick Garner