2011-02-01 9 views
2

私は表示する必要があるx POJOクラスのプロパティのリストを見つけました。また、プロパティを表示する見出しのリストも作成しました(見出しはフィールドの注釈からです)。POJOのプロパティを反復する

POJOの形式は、私が表示したいプロパティごとにゲッターがあることです。

詳細は次のとおりです。POJOに@Entityアノテーションが付けられています。私は(JPAを使用して)クエリを実行して結果セットを取得しています。私は今、正しいgetterを呼び出して、結果セット(特定のPOJOのコレクション)を表示したいと考えています。

私はgettersを呼び出すことができます。私の問題はこれをやっていない...私は大規模な結果セットでリフレクションを使用することは特に効率的ではないかもしれないと心配し、JPAエンティティオブジェクトを一貫性のある方法で反復可能にする方法があるかもしれません。

たとえば、各レコードをインデックス可能なコレクションとして返す簡単な方法があれば、各レコードに表示される順序でヘッダーを整列させて反復することができます。これはPOJOではなく、カプセル化されているので、APIの一部でそのように見える可能性があります。

提案を探してください!それは一方的に、あるいは別の方法ではうまくいくが、むしろかわいそうだろう。

+0

パフォーマンスについて疑問がある場合は、測定してください。 – meriton

+1

私は早すぎる最適化を打ち砕いたことを知っています。しかし、良いアプローチを見つけることの多くがあった。 – Quaternion

+0

私はそれがそうであるかどうかわかりませんが、両方の答えが私にとっても同じ価値があったので、私は2日待ってから受賞しました。最高の投票に2番目の最高の投票と50の賞金に答えました。私にとっては(esajとStasの間)。 – Quaternion

答えて

4

JPAを使用しているので、JPA 2メタモデル(javax.persistence.metamodel)を試してみましたか?これにより、JPAメタデータからJPAエンティティについての情報が得られます。

entityManager.getMetamodel().entity(entityClass). getAttributes(); 
+0

+1。これは正解、IMHOです。 –

1

私はそう思いません。ロジックレベルとデータストレージレベルを混在させるからです。それは、toStringメソッドまたはそのようなsmtをオーバーライドする方が良いです。アイデアを実装したい場合は、FieldUtilsをスローしてPropertyUtilsで値にアクセスするのが最も簡単な方法です

+0

エンティティのアノテーションだけの場合は、それはロジックではなく、埋め込まれたメタデータ...オブジェクトをトラバースし、データを抽出して処理するロジックは、他の場所になければなりません。 – esaj

+0

私は長い間BeanUtils.jarを無視してきました!それは私が必要とするものが正確に含まれて見ていいです! – Quaternion

+0

@esaj "論理レベル"私はビジネスロジックと "ビュー"ロジックを意味します。私はそれがJPAから分離されるべきだと思う。 –

3

リフレクションを使用する場合は、必ずオブジェクト内のゲッターを呼び出す必要はありません(ゲッターのみ値が返され、特別なロジックは含まれません)、フィールドがプライベートであっても(setAccessibleを参照)。

パフォーマンスに関しては、私たちは現在のプロジェクトで同様のことをしていますが、まだ問題はありません(最悪の場合、ハンドラはオブジェクトの注釈付きフィールドをチェックし、JSONデータをリフレクションによって構築しています)数百のオブジェクトからなるオブジェクトツリー(コレクション内のコレクション)で構成されます。各オブジェクトには、一握りから数十個までのフィールドが含まれます。

+0

これも非常に便利です。プライベートフィールドへの読み取りアクセスについて – Quaternion

関連する問題