Ich erstelle derzeit eine REST-API, in der Clients auf einfache Weise die meisten Eigenschaften einer bestimmten Entität filtern sollen. Die Verwendung von QueryDSL in Kombination mit Spring Data REST (an example by Oliver Gierke) ermöglicht es mir, leicht zu 90% von dem zu kommen, was ich möchte, indem es Clients erlaubt, durch Kombinieren von Abfrageparametern zu filtern, die sich auf Eigenschaften beziehen (z.B. /users?firstName=Dennis&lastName=Laumen
).Can Spring Data Die QueryDSL-Integration von REST wird für komplexere Abfragen verwendet.
Ich kann sogar die Zuordnung zwischen den Abfrageparametern und den Eigenschaften einer Entität anpassen, indem ich die Schnittstelle QuerydslBinderCustomizer
implementiere (z. B. für die Suche nach Groß-/Kleinschreibung oder Teilzeichenfolge). Das ist alles großartig, aber ich möchte auch, dass die Clients in der Lage sind, einige Typen mit Bereichen zu filtern. Zum Beispiel in Bezug auf eine Eigenschaft wie Geburtsdatum möchte ich etwas wie das folgende tun, /users?dateOfBirthFrom=1981-1-1&dateOfBirthTo=1981-12-31
. Dasselbe gilt für auf Zahlen basierende Eigenschaften, /users?idFrom=100&idTo=200
. Ich habe das Gefühl, dass dies mit der QuerydslBinderCustomizer
Schnittstelle möglich sein sollte, aber die Integration zwischen diesen beiden Bibliotheken ist nicht sehr ausführlich dokumentiert.
Abschließend ist dies mit Spring Data REST und QueryDSL möglich? Wenn das so ist, wie?
Danke @ oliver-gierke! Ich habe es basierend auf dem Beispiel, das Sie gegeben haben, zum Laufen gebracht und etwas mehr bedingte Logik hinzugefügt. Wenn nur ein Datum angegeben wird, wird es als "Von" -Datum verwendet. Könnten Sie noch eine zusätzliche Erklärung geben, ob es * auch * möglich ist, den Bindings nicht existierende Pfade hinzuzufügen? Ist mein Beispiel zum Hinzufügen eines "dateOfBirthFrom" -Abfrageparameters mit Spring Data REST und QueryDSL sogar möglich? (Nur neugierig, Sie lösten mein Problem bereits! Nochmals vielen Dank!) –
@DennisLaumen "dateOfBirthFrom" Stil Query-Parameter könnte hilfreich sein. Bei der Anpassung der Abfragebindung wird davon ausgegangen, dass, wenn nur ein Datum vorhanden ist, dieses Datum verwendet wird, oder? Eine Filterung mit nur einem Datum wäre jedoch nicht möglich. Irgendwelche Vorschläge @ oliver-gierke? – gazal
@gazal, habe ich das mit dem folgenden Code behoben, hoffe es hilft. 'bindings.bind (Date.class) .Alle ((DateTimePath Weg, Collection Erweitert Date> Wert) -> { Iterator it = value.iterator(); Datum firstTimestamp = it.next(); if (it.hasNext()) { Datum secondTimestamp = it.next(); return path.between (firstTimestamp, secondTimestamp); } else { return path.after (firstTimestamp) ; } }); ' –