Recherchez-vous un moyen simple de filtrer dynamiquement les entités ? Ne cherchez pas plus loin que Spring Filter. Avec Spring Filter, votre API bénéficiera d’une fonctionnalité de recherche complète. Même si vous ne disposez pas d'une API Web, vous pouvez toujours tirer parti du puissant générateur de filtres pour générer des requêtes SQL ou Mongo complexes.
La conception modulaire de la bibliothèque et son intégration transparente avec Spring facilitent son extension avec des opérateurs et des fonctions personnalisés, ou même son intégration dans une plate-forme différente. Dites adieu au casse-tête lié à la génération de requêtes valides dans les applications frontales, car des générateurs de filtres JavaScript sont également disponibles pour simplifier le processus.
Spring Filter 3.0.0 est une nouvelle version construite à partir de zéro. Il inclut une bien meilleure intégration avec Spring, avec de nombreuses nouvelles fonctionnalités, améliorations et corrections de bugs. La syntaxe du langage n'a pas changé, les applications frontend ne nécessiteront donc aucune modification. La nouvelle classe
FilterBuilder
est incompatible avec la précédente et d'autres modifications importantes sont présentes mais l'utilisation de base de la bibliothèque reste similaire. N'hésitez pas à créer un problème si vous remarquez quelque chose qui ne va pas. Pensez à soutenir le projet en nous parrainant.
Vous pouvez accéder à l'ancienne version dans la branche 2.xx.
/search?filter= moyenne (notes) > 4,5 et marque.nom en ['audi', 'land rover'] et (année > 2018 ou km < 50000) et couleur : 'blanc' et accidents est vide
/* 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 ;
// ...
}
Oui, nous prenons en charge les booléens, les dates, les énumérations, les fonctions et même les relations ! Besoin d'autre chose ? Dites-le-nous ici.
Parrainez notre projet et bénéficiez de l’avantage de donner la priorité à vos problèmes pour une résolution rapide.
< 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 );
}
Le référentiel doit implémenter JpaSpecificationExecutor
afin d'exécuter la spécification Spring, SimpleJpaRepository
est une implémentation bien connue. Vous pouvez supprimer l'argument Pageable
et renvoyer une List
si la pagination et le tri ne sont pas nécessaires.
< 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
Veuillez noter que ConversionService
de Spring est utilisé en interne lors de la conversion d'objets en chaînes et vice-versa. Spring Filter n'applique aucun modèle pour les dates et autres types. La personnalisation doit être effectuée directement dans Spring si nécessaire.
Au lieu d'écrire manuellement des requêtes de chaîne dans vos applications frontales, vous pouvez utiliser le générateur de requêtes JavaScript.
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 ( ) ) ;
Veuillez consulter la documentation.
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
Vous trouverez ci-dessous la liste des opérateurs et fonctions pris en charge par toutes les intégrations (JPA et Mongo). Les intégrations peuvent étendre ce langage commun.
Littéral | Description | Exemple |
---|---|---|
et | et sont deux expressions | statut : 'actif' et créé à > '1-1-2000' |
ou | ou sont deux expressions | valeur ~ '*bonjour*' ou nom ~ '*monde*' |
pas | ce n'est pas une expression | pas (id > 100 oucategory.order est nul) |
Littéral | Description | Exemple |
---|---|---|
~ | vérifie si l'expression de gauche (chaîne) est similaire à l'expression de droite (chaîne) | catalogue.name ~ '*électronique*' |
~~ | similaire à l'opérateur précédent mais insensible à la casse | catalogue.nom ~~ 'ElEcTroNic*' |
: | vérifie si l'expression de gauche est égale à l'expression de droite | identifiant : 5 |
! | vérifie si l'expression de gauche n'est pas égale à l'expression de droite | nom d'utilisateur ! 'torshide' |
> | vérifie si l'expression de gauche est supérieure à l'expression de droite | distance > 100 |
> : | vérifie si l'expression de gauche est supérieure ou égale à l'expression de droite | distance > : 100 |
< | vérifie si l'expression de gauche est plus petite que l'expression de droite | distance < 100 |
< : | vérifie si l'expression de gauche est plus petite ou égale à l'expression de droite | distance < : 100 |
est nul | vérifie si une expression est nulle | le statut est nul |
n'est pas nul | vérifie si une expression n'est pas nulle | le statut n'est pas nul |
est vide | vérifie si l'expression (de collection) est vide | les enfants sont vides |
n'est pas vide | vérifie si l'expression (de collection) n'est pas vide | les enfants ne sont pas vides |
dans | vérifie si une expression est présente dans les bonnes expressions | statut dans [ 'initialisé' , 'actif' ] |
pas dans | vérifie si une expression n'est pas présente dans les bonnes expressions | le statut n'est pas dans [ 'échec' , 'fermé' ] |
Nom | Description | Exemple |
---|---|---|
taille | renvoie la taille de la collection | taille ( accidents ) |
Les idées et les demandes de tirage sont toujours les bienvenues. Le style Java de Google est utilisé pour le formatage.
Distribué sous licence MIT.