現在、クライアントが特定のエンティティのほとんどのプロパティを簡単にフィルタするようにするREST APIを構築しています。 QueryDSLをSpring Data REST(an example by Oliver Gierke)と組み合わせて使用すると、プロパティ(例:/users?firstName=Dennis&lastName=Laumen
)を参照するクエリパラメータを組み合わせてクライアントがフィルタリングできるようにすることで、自分が望むものの90%を簡単に取得できます。SpringデータRESTのQueryDSL統合を使用してより複雑なクエリを実行できますか?
QuerydslBinderCustomizer
インターフェイス(たとえば、大文字小文字を区別しない検索や部分文字列の一致など)を実装することで、クエリパラメータとエンティティのプロパティの間のマッピングをカスタマイズすることもできます。これはすべて素晴らしいですが、クライアントが範囲を使用していくつかのタイプをフィルタリングできるようにしたいと思います。例えば、生年月日のようなプロパティに関しては、私は次のようなものをしたいと思います。/users?dateOfBirthFrom=1981-1-1&dateOfBirthTo=1981-12-31
同じことが数字ベースのプロパティの場合は/users?idFrom=100&idTo=200
になります。私はこれがQuerydslBinderCustomizer
インターフェイスを使って可能でなければならないと感じていますが、これら2つのライブラリの統合は非常に広範には書かれていません。
これは、Spring Data RESTとQueryDSLを使用すると可能ですか?もしそうなら、どうですか?
ありがとう@ oliver-gierke!あなたが与えた例に基づいて動作するようにして、さらに条件付きのロジックを追加しました。そのため、日付が1つだけ指定されている場合は、「from」日付として使用されます。 バインディングに存在しないパスを追加することも可能ですか? SpringデータRESTとQueryDSLを使用して "dateOfBirthFrom"クエリパラメータを追加することも可能ですか? (ちょっと不思議なことに、私の問題はすでに解決済みです!ありがとうございます!) –
@DennisLaumen "dateOfBirthFrom"スタイルのクエリパラメータが役立つかもしれません。クエリバインドのカスタマイズでは、日付が1つしかない場合は日付として使用されていると仮定します。しかし、これまでの日付を使用したフィルタリングは不可能です。どのような提案@ oliver-gierke? – gazal
@gazal、次のコードを使用してこれを修正しました。 'bindings.bind(Date.class).ALL((DateTimePathパス、コレクション値)<日が延びる?> - > { イテレータ<日付を拡張>が(value.iteratorを=); 日firstTimestamp = it.next(); IF(it.hasNext()){ 日secondTimestamp = it.next(); 戻りpath.between(firstTimestamp、secondTimestamp); }他{ 戻りpath.after(firstTimestamp) ; } }); ' –