エンティティを動的にフィルタリングする簡単な方法をお探しですか?スプリングフィルター以外に探す必要はありません。 Spring Filter を使用すると、API は包括的な検索機能の恩恵を受けることができます。 Web API がない場合でも、強力なフィルター ビルダーを利用して、複雑な SQL または Mongo クエリを生成できます。
このライブラリのモジュラー設計と Spring とのシームレスな統合により、カスタム演算子や関数を使って簡単に拡張したり、別のプラットフォームに統合したりすることもできます。プロセスを簡素化するために JavaScript フィルター ビルダーも利用できるため、フロントエンド アプリケーションで有効なクエリを生成するという煩わしさから解放されます。
Spring Filter 3.0.0 は、ゼロから構築された新しいリリースです。 Spring との統合がさらに強化され、多くの新機能、拡張機能、バグ修正が含まれています。言語構文は変更されていないため、フロントエンド アプリケーションを変更する必要はありません。新しい
FilterBuilder
クラスは以前のクラスと互換性がなく、その他の重大な変更が存在しますが、ライブラリの基本的な使用法は同様です。何か問題があることに気づいた場合は、お気軽に問題を作成してください。私たちのスポンサーとなってプロジェクトを支援することを検討してください。
2.xx ブランチで古いバージョンにアクセスできます。
/search?filter=平均(評価) > 4.5および['audi', 'land rover']のブランド名および(年> 2018またはkm < 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 );
}
Spring の仕様を実行するには、リポジトリでJpaSpecificationExecutor
を実装する必要があります。SimpleJpaRepository 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) でサポートされる演算子と関数をリストします。統合により、この共通言語が拡張される可能性があります。
リテラル | 説明 | 例 |
---|---|---|
そして | と の 2 つの式 | ステータス: 'アクティブ'およびcreatedAt > '2000-1-1' |
または | or の 2 つの式 | 値 ~ '*hello*'または名前 ~ '*world*' |
ない | 表現ではありません | そうでない(id > 100 または category.order が null) |
リテラル | 説明 | 例 |
---|---|---|
~ | 左(文字列)の式が右(文字列)の式と類似しているかどうかをチェックします | カタログ名~ '*電子*' |
~~ | 前の演算子と似ていますが、大文字と小文字は区別されません | カタログ名~~ 'ElEcTroNic*' |
: | 左の式が右の式と等しいかどうかをチェックします | ID : 5 |
! | 左の式が右の式と等しくないかどうかをチェックします | ユーザー名! 「トルシード」 |
> | 左の式が右の式より大きいかどうかをチェックします | 距離> 100 |
>: | 左の式が右の式以上であるかどうかをチェックします | 距離>: 100 |
< | 左の式が右の式より小さいかどうかを確認します | 距離< 100 |
<: | 左の式が右の式より小さいか等しいかどうかをチェックします | 距離<: 100 |
ヌルです | 式がnullかどうかをチェックします | ステータスはヌルです |
nullではありません | 式がnullでないかどうかをチェックします | ステータスが null ではありません |
空です | (コレクション) 式が空かどうかを確認します | 子供たちは空です |
空ではありません | (コレクション) 式が空でないかどうかを確認します | 子供たちは空ではない |
で | 式が正しい式に存在するかどうかを確認します | [ '初期化' 、 'アクティブ' ]のステータス |
入っていない | 式が正しい式に存在しないかどうかをチェックします | ステータスが [ 'failed' 、 'closed' ]ではありません |
名前 | 説明 | 例 |
---|---|---|
サイズ | コレクションのサイズを返します | サイズ(事故) |
アイデアやプルリクエストはいつでも大歓迎です。書式設定には Google の Java スタイルが使用されます。
MIT ライセンスに基づいて配布されます。