您是否正在寻找一种轻松的方式来动态过滤实体?弹簧过滤器就是您的最佳选择。借助 Spring Filter,您的 API 将受益于全面的搜索功能。即使您没有 Web API,您仍然可以利用强大的过滤器生成器来生成复杂的 SQL 或 Mongo 查询。
该库的模块化设计以及与 Spring 的无缝集成使得可以轻松地使用自定义运算符和函数进行扩展,甚至将其集成到不同的平台中。告别在前端应用程序中生成有效查询的麻烦,因为 JavaScript 过滤器构建器也可以用来简化该过程。
Spring Filter 3.0.0 是一个从头开始构建的新版本。它包括与 Spring 更好的集成,以及许多新功能、增强功能和错误修复。语言语法没有改变,因此前端应用程序不需要任何修改。新的
FilterBuilder
类与前一个类不兼容,并且存在其他重大更改,但该库的基本用法保持相似。如果您发现任何问题,请随时创建问题。考虑通过赞助我们来支持该项目。
您可以在 2.xx 分支中访问旧版本。
/search?filter=平均(评级) > 4.5且品牌名称为['奥迪'、'路虎']和(年份> 2018或公里< 50000),颜色: '白色' ,事故为空
/* 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 ;
// ...
}
是的,我们支持布尔值、日期、枚举、函数,甚至关系!还需要别的东西吗?在这里告诉我们。
赞助我们的项目,并获得优先处理您的问题以便迅速解决的优势。
< 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 );
}
存储库应该实现JpaSpecificationExecutor
以便执行 Spring 的规范, SimpleJpaRepository
是一个众所周知的实现。如果不需要分页和排序,您可以删除Pageable
参数并返回List
。
< 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
请注意,当将对象转换为字符串时,Spring 的ConversionService
在内部使用,反之亦然。 Spring Filter 不强制日期和其他类型的任何模式。如果需要,定制应该直接在 Spring 中完成。
您可以使用 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 ( ) ) ;
请参阅文档。
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
下面列出了所有集成(JPA 和 Mongo)支持的运算符和函数。集成可以扩展这种通用语言。
文字 | 描述 | 例子 |
---|---|---|
和 | and 的两个表达式 | 状态:“活动”且创建时间>“1-1-2000” |
或者 | or 的两个表达式 | 值 ~ '*hello*'或名称 ~ '*world*' |
不是 | 不是一个表达式 | 不(id > 100 或category.order 为空) |
文字 | 描述 | 例子 |
---|---|---|
~ | 检查左侧(字符串)表达式是否与右侧(字符串)表达式相似 | Catalog.name ~ '*电子*' |
~~ | 与前面的运算符类似,但不区分大小写 | Catalog.name ~~ 'ElEcTroNic*' |
: | 检查左侧表达式是否等于右侧表达式 | 编号: 5 |
! | 检查左侧表达式是否不等于右侧表达式 | 用户名! '托西德' |
> | 检查左侧表达式是否大于右侧表达式 | 距离> 100 |
>: | 检查左侧表达式是否大于或等于右侧表达式 | 距离>: 100 |
< | 检查左侧表达式是否小于右侧表达式 | 距离< 100 |
<: | 检查左侧表达式是否小于或等于右侧表达式 | 距离<: 100 |
为空 | 检查表达式是否为空 | 状态为空 |
不为空 | 检查表达式是否不为空 | 状态不为空 |
是空的 | 检查(集合)表达式是否为空 | 孩子们是空的 |
不为空 | 检查(集合)表达式是否不为空 | 孩子不为空 |
在 | 检查表达式是否存在于正确的表达式中 | [ '已初始化' , '活动' ]中的状态 |
不在 | 检查表达式是否不存在于正确的表达式中 | 状态不在 [ '失败' , '已关闭' ] |
姓名 | 描述 | 例子 |
---|---|---|
尺寸 | 返回集合的大小 | 尺寸(事故) |
始终欢迎想法和拉取请求。 Google 的 Java 样式用于格式化。
根据麻省理工学院许可分发。