¿Está buscando una forma sencilla de filtrar entidades dinámicamente? No busque más, Spring Filter. Con Spring Filter, su API se beneficiará de una funcionalidad de búsqueda integral. Incluso si no tiene una API web, aún puede aprovechar el potente generador de filtros para generar consultas SQL o Mongo complejas.
El diseño modular de la biblioteca y su perfecta integración con Spring facilitan su ampliación con operadores y funciones personalizados, o incluso su integración en una plataforma diferente. Diga adiós al dolor de cabeza de generar consultas válidas en aplicaciones frontend, ya que los creadores de filtros de JavaScript también están disponibles para simplificar el proceso.
Spring Filter 3.0.0 es una nueva versión creada desde cero. Incluye una integración mucho mejor con Spring, con muchas características nuevas, mejoras y correcciones de errores. La sintaxis del idioma no cambió, por lo que las aplicaciones frontend no requerirán ninguna modificación. La nueva clase
FilterBuilder
es incompatible con la anterior y hay otros cambios importantes, pero el uso básico de la biblioteca sigue siendo similar. No dude en crear un problema si nota algún problema. Considere apoyar el proyecto patrocinándonos.
Puede acceder a la versión anterior en la rama 2.xx.
/search?filter= promedio (calificaciones) > 4.5 y nombre de marca en ['audi', 'land rover'] y (año > 2018 o km < 50000) y color : 'blanco' y accidentes está vacío
/* 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 ;
// ...
}
Sí, admitimos valores booleanos, fechas, enumeraciones, funciones e incluso relaciones . ¿Necesitas algo más? Cuéntanos aquí.
Patrocine nuestro proyecto y obtenga la ventaja de que sus problemas sean priorizados para una pronta resolución.
< 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 );
}
El repositorio debe implementar JpaSpecificationExecutor
para poder ejecutar la especificación de Spring; SimpleJpaRepository
es una implementación bien conocida. Puede eliminar el argumento Pageable
y devolver una List
si no se necesitan paginación ni clasificación.
< 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
Tenga en cuenta que ConversionService
de Spring se utiliza internamente al convertir objetos en cadenas y viceversa. Spring Filter no aplica ningún patrón para fechas y otros tipos. La personalización debe realizarse directamente dentro de Spring si es necesario.
En lugar de escribir manualmente consultas de cadenas en sus aplicaciones frontend, puede utilizar el generador de consultas de 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 ( ) ) ;
Por favor consulte la documentación.
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
A continuación se enumeran los operadores y funciones compatibles con todas las integraciones (JPA y Mongo). Las integraciones pueden ampliar este lenguaje común.
Literal | Descripción | Ejemplo |
---|---|---|
y | y las dos expresiones | estado: 'activo' y creado en > '1-1-2000' |
o | o las dos expresiones | valor ~ '*hola*' o nombre ~ '*mundo*' |
no | no es una expresión | no (id > 100 o categoría.orden es nulo) |
Literal | Descripción | Ejemplo |
---|---|---|
~ | comprueba si la expresión izquierda (cadena) es similar a la expresión derecha (cadena) | nombre.catálogo ~ '*electrónico*' |
~~ | similar al operador anterior pero no distingue entre mayúsculas y minúsculas | nombre.catálogo ~~ 'ElEcTroNic*' |
: | comprueba si la expresión de la izquierda es igual a la expresión de la derecha | identificación : 5 |
! | comprueba si la expresión de la izquierda no es igual a la expresión de la derecha | nombre de usuario ! 'torshid' |
> | comprueba si la expresión de la izquierda es mayor que la expresión de la derecha | distancia > 100 |
>: | comprueba si la expresión de la izquierda es mayor o igual a la expresión de la derecha | distancia >: 100 |
< | comprueba si la expresión de la izquierda es más pequeña que la expresión de la derecha | distancia < 100 |
<: | comprueba si la expresión de la izquierda es menor o igual a la expresión de la derecha | distancia <: 100 |
es nulo | comprueba si una expresión es nula | el estado es nulo |
no es nulo | comprueba si una expresión no es nula | el estado no es nulo |
esta vacio | comprueba si la expresión (colección) está vacía | los niños están vacíos |
no esta vacio | comprueba si la expresión (colección) no está vacía | los niños no están vacíos |
en | comprueba si una expresión está presente en las expresiones correctas | estado en [ 'inicializado' , 'activo' ] |
no en | comprueba si una expresión no está presente en las expresiones correctas | estado no en [ 'fallido' , 'cerrado' ] |
Nombre | Descripción | Ejemplo |
---|---|---|
tamaño | devuelve el tamaño de la colección | tamaño ( accidentes ) |
Las ideas y solicitudes de extracción siempre son bienvenidas. Para formatear se utiliza el estilo Java de Google.
Distribuido bajo la licencia MIT.