2017-11-09 7 views
1

私は30個のフィールドを含むEntityを持っています。Spring JpaRepositortは選択したpojoフィールドを返します

現在、findAllfindAllBy ...残りのフィルタリングサービスを提供するためにPagingAndSortingRepositoryを使用しています。これにより、30個のフィールドがすべて返されます。

私は選択したフィールドのみを返す必要があります。

例えば、ユーザがfield1field5field11field25を選択し、サービスは、これらの4つのフィールドのみを含むJSONを返すべきです。

私はどのような提案やこれを行う方法の例がありがとうと思います。私が考えるのが最も簡単なのは、その場でクエリを作成することですが、この場合はPagingAndSortingRepositoryのインターフェイスでは表示されません。

ページングとソート機能を維持する必要があります。

+0

'PagingAndSortingRepository'インスタンスを@RestControllerとして直接公開していますか、その間にレイヤーがありますか?@RestControllerまたは中間表現からエンティティ自体を返していますか? –

+0

私はサービス(インターフェイス)とserviceImplを間に持っています。コントローラは、サービスimplを呼び出し、これが次にrepoを呼び出します。 – jscriptor

+0

PagingAndSortingRepositoryは、コントローラに返されるページをサービスに返します。このページは完全なPojoのリストです – jscriptor

答えて

0

固定セット・ソリューション:場合

はあなたが事前に定義された組み合わせのプロパティセットを持って、あなたは離れて注釈付き得ることができる(例えば、1つのユースケースのためにfield1field3field20を組み合わせて、別のユースケースのためfield4field8を返します。) POJOに複数の@JsonView注釈が付いています(詳しい説明はhttp://www.baeldung.com/jackson-json-view-annotationを参照してください)。

必要なフィールドのセットに応じて、ユーザーが要求した「設定」に基づいて、コントローラで正しい表示を使用できます。

ダイナミックセットソリューション1: あなたが実際にリソースによって返されるフィールドの(事前に知られていない)任意のランダムな組み合わせをしたい場合は、JsonViewはそれをカットされません。

代わりに、カスタムBeanPropertyWriterまたは要求されていないプロパティをスキップする(jsonGen.writeXXXを呼び出さない)カスタムシリアライザを追加できます。ここでの難しさは、リクエストされたプロパティ(RESTコントローラに渡される)をSpringのJacksonメッセージコンバータによって呼び出されるwriter/serializerで知ることです。これがどのように機能するかは100%確信していませんが、同じPOJOを使用することができます。

ダイナミックセット・ソリューション2:

少し退屈:あなただけではなく、コントローラからPOJOを返すので、MapにPOJOを変換するために、あなたのcommons-beanutilsを使用することができます。このようにして、POJOのフラットな表現ができます。次に、「要求されたフィールド」リストに含まれていないキーをマップから削除し、マップ(またはリスト/ページ)を返して、それにマジックをかけることができます。

これは、これは非常に抽出するオブジェクトのいずれかのタイプにも適用することができます...あなたは私が推測する高度なJSON *注釈を使用していない場合は、POJO自体によって生成されるのと同じJSONに

を発生しますベースのリソースや何かのこの振る舞いは、重い持ち上げを隠すことはありません。

+0

私はPOJOのフィールド数と潜在的なリクエストの組み合わせが多いため、提案されたアプローチとは異なるアプローチを使用しました。完全なjsonがJpaRepo呼び出しから戻った後、私はビューに送信する前に不要なフィールドを削除するためにjson excludeを使いました。これはうまくいくようです。 – jscriptor

関連する問題