Attualmente sto costruendo un'API REST in cui desidero che i client filtrino facilmente sulla maggior parte delle proprietà di un'entità specifica. L'utilizzo di QueryDSL in combinazione con Spring Data REST (an example by Oliver Gierke) mi consente di ottenere facilmente il 90% di ciò che voglio consentendo ai client di filtrare combinando i parametri di query che fanno riferimento alle proprietà (ad esempio /users?firstName=Dennis&lastName=Laumen
).È possibile utilizzare l'integrazione QueryDSL di Spring Data REST per eseguire query più complesse?
Posso anche personalizzare la mappatura tra i parametri di query e le proprietà di un'entità implementando l'interfaccia QuerydslBinderCustomizer
(ad esempio per ricerche non sensibili alle maiuscole o parziali di stringhe parziali). Tutto questo è fantastico, ma voglio anche che i client siano in grado di filtrare alcuni tipi utilizzando gli intervalli. Ad esempio per quanto riguarda una proprietà come data di nascita vorrei fare qualcosa come il seguente, /users?dateOfBirthFrom=1981-1-1&dateOfBirthTo=1981-12-31
. Lo stesso vale per le proprietà basate sui numeri, /users?idFrom=100&idTo=200
. Ho la sensazione che questo dovrebbe essere possibile usando l'interfaccia QuerydslBinderCustomizer
ma l'integrazione tra queste due librerie non è documentata molto estesamente.
Concludendo, è possibile utilizzare Spring Data REST e QueryDSL? Se é cosi, come?
Grazie @ oliver-gierke! L'ho fatto funzionare in base all'esempio che hai fornito e ho aggiunto un po 'di logica condizionale, quindi se viene data una sola data viene usata come una data "da". Puoi aggiungere qualche altra spiegazione aggiuntiva se sia * anche * possibile aggiungere percorsi inesistenti ai binding? Il mio esempio di aggiunta di un parametro di query "dateOfBirthFrom" è possibile anche utilizzando Spring Data REST e QueryDSL? (Solo curioso, hai già risolto il mio problema! Grazie ancora!) –
@DennisLaumen parametro "dateOfBirthFrom" potrebbe essere utile. La personalizzazione del binding di query presuppone che se esiste una sola data utilizzata come da data, giusto? Ma il filtraggio usando solo un appuntamento non sarebbe possibile. Qualche suggerimento @ oliver-gierke? – gazal
@gazal, ho risolto questo problema utilizzando il codice seguente, spero che sia d'aiuto. 'bindings.bind (Date.class) .Tutte ((DateTimePath percorso, Collection Estende Data> Valore) -> { Iterator it = value.iterator();? Data firstTimestamp = it.next(); se (it.hasNext()) { Data secondTimestamp = it.next(); ritorno path.between (firstTimestamp, secondTimestamp);} else { ritorno path.after (firstTimestamp) ; } }); ' –