Suchen Sie nach einer mühelosen Möglichkeit, Entitäten dynamisch zu filtern? Dann sind Sie bei Spring Filter genau richtig. Mit Spring Filter profitiert Ihre API von einer umfassenden Suchfunktion. Auch wenn Sie keine Web-API haben, können Sie den leistungsstarken Filter-Builder nutzen, um komplexe SQL- oder Mongo-Abfragen zu generieren.
Der modulare Aufbau der Bibliothek und die nahtlose Integration mit Spring erleichtern die Erweiterung um benutzerdefinierte Operatoren und Funktionen oder sogar die Integration in eine andere Plattform. Verabschieden Sie sich von der Mühe, gültige Abfragen in Frontend-Anwendungen zu generieren, denn es stehen auch JavaScript-Filter-Builder zur Vereinfachung des Prozesses zur Verfügung.
Spring Filter 3.0.0 ist eine neue Version, die von Grund auf neu entwickelt wurde. Es beinhaltet eine viel bessere Integration mit Spring, mit vielen neuen Funktionen, Verbesserungen und Fehlerbehebungen. Die Sprachsyntax hat sich nicht geändert, Frontend-Anwendungen müssen daher nicht geändert werden. Die neue
FilterBuilder
Klasse ist mit der vorherigen nicht kompatibel und es sind weitere wichtige Änderungen vorhanden, aber die grundlegende Verwendung der Bibliothek bleibt ähnlich. Bitte erstellen Sie ein Problem, wenn Ihnen etwas Ungewöhnliches auffällt. Erwägen Sie, das Projekt zu unterstützen, indem Sie uns sponsern.
Auf die ältere Version können Sie im Zweig 2.xx zugreifen.
/search?filter= Durchschnitt (Bewertungen) > 4,5 und Markenname in ['audi', 'land rover'] und (Jahr > 2018 oder km < 50000) und Farbe : 'weiß' und Unfälle sind leer
/* Entity used in the query above */
@ Entity public class Car {
@ Id long id ;
int year ;
int km ;
@ Enumerated Color color ;
@ ManyToOne Brand brand ;
@ OneToMany List < Accident > accidents ;
@ ElementCollection List < Integer > ratings ;
// ...
}
Ja, wir unterstützen Boolesche Werte, Datumsangaben, Aufzählungen, Funktionen und sogar Beziehungen ! Brauchen Sie noch etwas? Sag es uns hier.
Sponsern Sie unser Projekt und profitieren Sie davon, dass Ihre Probleme priorisiert und umgehend gelöst werden.
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >jpa</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter Specification < Entity > spec , Pageable page ) {
return repository . findAll ( spec , page );
}
Das Repository sollte JpaSpecificationExecutor
implementieren, um die Spring-Spezifikation auszuführen. SimpleJpaRepository
ist eine bekannte Implementierung. Sie können das Pageable
-Argument entfernen und eine List
zurückgeben, wenn Paginierung und Sortierung nicht erforderlich sind.
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >mongo</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter ( entityClass = Entity . class ) Query query , Pageable page ) {
return mongoTemplate . find ( query . with ( pageable ), Entity . class );
}
public interface EntityRepository extends MongoRepository < Entity , String > {
@ Query ( "?0" )
List < Employee > findAll ( Document document );
@ Query ( "?0" )
Page < Employee > findAll ( Document document , Pageable pageable );
}
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter ( entityClass = Entity . class ) Document document , Pageable page ) {
return entityRepository . findAll ( query , page );
}
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >core</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ Autowired FilterBuilder fb ;
FilterNode filter = fb . field ( "year" ). equal ( fb . input ( 2023 )). and ( fb . isNull ( fb . field ( "category" ))). get ();
@ Autowired ConversionService cs ;
String query = cs . convert ( filter , String . class ); // year : 2023 and category is null
Bitte beachten Sie, dass ConversionService
von Spring intern beim Konvertieren von Objekten in Strings und umgekehrt verwendet wird. Spring Filter erzwingt kein Muster für Datumsangaben und andere Typen. Die Anpassung sollte bei Bedarf direkt in Spring erfolgen.
Anstatt String-Abfragen manuell in Ihren Frontend-Anwendungen zu schreiben, können Sie den JavaScript-Abfrage-Builder verwenden.
import { sfAnd , sfEqual , sfGt , sfIsNull , sfLike , sfNot , sfOr } from 'spring-filter-query-builder' ;
const filter = sfAnd ( [
sfAnd ( [ sfEqual ( 'status' , 'active' ) , sfGt ( 'createdAt' , '1-1-2000' ) ] ) ,
sfOr ( [ sfLike ( 'value' , '*hello*' ) , sfLike ( 'name' , '*world*' ) ] ) ,
sfNot ( sfOr ( [ sfGt ( 'id' , 100 ) , sfIsNull ( 'category.order' ) ] ) ) ,
] ) ;
const req = await fetch ( 'http://api/person?filter=' + filter . toString ( ) ) ;
Bitte beachten Sie die Dokumentation.
field
, field.nestedField
123
, -321.123
, true
, false
, 'hello world'
, 'escape ' quote'
, '1-01-2023'
[1, 2, 3]
, [field, ['x', 'y'], 99]
f()
, f(x)
, f(x, y)
`place_holder`
x and (y or z)
op expr
, not ready
expr op expr
, x and y
expr op
, field is null
Nachfolgend sind die Operatoren und Funktionen aufgeführt, die von allen Integrationen (JPA und Mongo) unterstützt werden. Integrationen können diese gemeinsame Sprache erweitern.
Wörtlich | Beschreibung | Beispiel |
---|---|---|
Und | und sind zwei Ausdrücke | Status: 'aktiv' und erstellt am > '1-1-2000' |
oder | oder sind zwei Ausdrücke | Wert ~ '*Hallo*' oder Name ~ '*Welt*' |
nicht | nicht ist ein Ausdruck | nicht (id > 100 oder Category.order ist null) |
Wörtlich | Beschreibung | Beispiel |
---|---|---|
~ | prüft, ob der linke (String-)Ausdruck dem rechten (String-)Ausdruck ähnlich ist | Katalogname ~ '*elektronisch*' |
~~ | ähnelt dem vorherigen Operator, unterscheidet jedoch nicht zwischen Groß- und Kleinschreibung | Katalogname ~~ 'ElEcTronic*' |
: | prüft, ob der linke Ausdruck mit dem rechten Ausdruck übereinstimmt | ID : 5 |
! | prüft, ob der linke Ausdruck nicht mit dem rechten Ausdruck übereinstimmt | Benutzername ! 'Torshid' |
> | prüft, ob der linke Ausdruck größer als der rechte Ausdruck ist | Abstand > 100 |
>: | prüft, ob der linke Ausdruck größer oder gleich dem rechten Ausdruck ist | Abstand >: 100 |
< | prüft, ob der linke Ausdruck kleiner als der rechte Ausdruck ist | Abstand < 100 |
<: | prüft, ob der linke Ausdruck kleiner oder gleich dem rechten Ausdruck ist | Abstand <: 100 |
ist null | prüft, ob ein Ausdruck null ist | Status ist null |
ist nicht null | prüft, ob ein Ausdruck nicht null ist | Der Status ist nicht null |
ist leer | prüft, ob der (Sammlungs-)Ausdruck leer ist | Kinder ist leer |
ist nicht leer | prüft, ob der (Sammlungs-)Ausdruck nicht leer ist | Kinder ist nicht leer |
In | prüft, ob ein Ausdruck in den richtigen Ausdrücken vorhanden ist | Status in [ 'initialisiert' , 'aktiv' ] |
nicht drin | prüft, ob ein Ausdruck nicht in den richtigen Ausdrücken vorhanden ist | Status nicht in [ 'fehlgeschlagen' , 'geschlossen' ] |
Name | Beschreibung | Beispiel |
---|---|---|
Größe | gibt die Größe der Sammlung zurück | Größe ( Unfälle ) |
Ideen und Pull-Requests sind jederzeit willkommen. Zur Formatierung wird der Java Style von Google verwendet.
Wird unter der MIT-Lizenz vertrieben.