您是否正在尋找一種輕鬆的方式來動態過濾實體?彈簧過濾器就是您的最佳選擇。借助 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 樣式用於格式化。
根據麻省理工學院許可分發。