Você está procurando uma maneira fácil de filtrar entidades dinamicamente? Não procure mais, Filtro Spring. Com Spring Filter, sua API se beneficiará de uma funcionalidade de pesquisa abrangente. Mesmo que você não tenha uma API Web, ainda poderá aproveitar o poderoso construtor de filtros para gerar consultas SQL ou Mongo complexas.
O design modular da biblioteca e a integração perfeita com o Spring facilitam a extensão com operadores e funções personalizados ou até mesmo a integração em uma plataforma diferente. Diga adeus à dor de cabeça de gerar consultas válidas em aplicativos frontend, pois construtores de filtros JavaScript também estão disponíveis para simplificar o processo.
Spring Filter 3.0.0 é uma nova versão construída do zero. Inclui uma integração muito melhor com o Spring, com muitos novos recursos, melhorias e correções de bugs. A sintaxe da linguagem não mudou; portanto, os aplicativos frontend não exigirão nenhuma modificação. A nova classe
FilterBuilder
é incompatível com a anterior e outras alterações importantes estão presentes, mas o uso básico da biblioteca permanece semelhante. Sinta-se à vontade para criar um problema se notar algo errado. Considere apoiar o projeto patrocinando-nos.
Você pode acessar a versão mais antiga na ramificação 2.xx.
/search?filter= média (classificações) > 4,5 e brand.name em ['audi', 'land rover'] e (ano > 2018 ou km < 50000) e cor : 'branco' e acidentes está vazio
/* 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 ;
// ...
}
Sim, oferecemos suporte a booleanos, datas, enumerações, funções e até relações ! Precisa de mais alguma coisa? Conte-nos aqui.
Patrocine nosso projeto e tenha a vantagem de ter seus problemas priorizados para pronta resolução.
< 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 );
}
O repositório deve implementar JpaSpecificationExecutor
para executar a especificação do Spring, SimpleJpaRepository
é uma implementação bem conhecida. Você pode remover o argumento Pageable
e retornar uma List
se a paginação e a classificação não forem necessárias.
< 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
Observe que ConversionService
do Spring é usado internamente ao converter objetos em strings e vice-versa. Spring Filter não impõe nenhum padrão para datas e outros tipos. A personalização deve ser feita diretamente no Spring, se necessário.
Em vez de escrever manualmente consultas de string em seus aplicativos frontend, você pode usar o construtor de consultas 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 ( ) ) ;
Consulte a documentação.
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
Abaixo estão listados os operadores e funções que são suportados por todas as integrações (JPA e Mongo). As integrações podem estender esta linguagem comum.
Literal | Descrição | Exemplo |
---|---|---|
e | e são duas expressões | status: 'ativo' e criado em> '1-1-2000' |
ou | ou são duas expressões | valor ~ '*hello*' ou nome ~ '*world*' |
não | não é uma expressão | não (id > 100 ou categoria.order é nulo) |
Literal | Descrição | Exemplo |
---|---|---|
~ | verifica se a expressão da esquerda (string) é semelhante à expressão da direita (string) | catalog.name ~ '*eletrônico*' |
~~ | semelhante ao operador anterior, mas sem distinção entre maiúsculas e minúsculas | catalog.name ~~ 'ElEcTroNic*' |
: | verifica se a expressão da esquerda é igual à expressão da direita | identificação : 5 |
! | verifica se a expressão da esquerda não é igual à expressão da direita | nome de usuário ! 'torhid' |
> | verifica se a expressão da esquerda é maior que a expressão da direita | distância > 100 |
>: | verifica se a expressão da esquerda é maior ou igual à expressão da direita | distância >: 100 |
< | verifica se a expressão da esquerda é menor que a expressão da direita | distância < 100 |
<: | verifica se a expressão da esquerda é menor ou igual à expressão da direita | distância <: 100 |
é nulo | verifica se uma expressão é nula | status é nulo |
não é nulo | verifica se uma expressão não é nula | status não é nulo |
está vazio | verifica se a expressão (coleção) está vazia | as crianças estão vazias |
não está vazio | verifica se a expressão (coleção) não está vazia | crianças não estão vazias |
em | verifica se uma expressão está presente nas expressões corretas | status em [ 'inicializado' , 'ativo' ] |
não em | verifica se uma expressão não está presente nas expressões corretas | status não está em [ 'failed' , 'closed' ] |
Nome | Descrição | Exemplo |
---|---|---|
tamanho | retorna o tamanho da coleção | tamanho ( acidentes ) |
Ideias e solicitações pull são sempre bem-vindas. O estilo Java do Google é usado para formatação.
Distribuído sob a licença do MIT.