10個のフィールドを持つエンティティがあるとします。これらのフィールドのほとんどすべてが非常に大きなデータを持っているとしましょう。また、エンティティ(フィールドのセットではありません)をロードし、実行時にロードするフィールドを定義します。私が見つけた解決策https://stackoverflow.com/a/24710759/5057736は、コンストラクタを使うことを示唆しています。しかし、10フィールドの場合、実行時にフィールドを定義する必要があることは解決策ではありません。 jpa 2.1を使ってこの問題を解決する方法はありますか?Hibernate - 実行時にフィールドが定義されたエンティティをロードする
答えて
クエリによって取得するフィールドを定義するJPA 2.1 EntityGraphを使用します。あなたはクラスMyClass
を持っており、動的に特定のフィールドを取得したいのであれば、このようなものはない、個々のフィールドに対して、
EntityGraph<MyClass> eg = em.createEntityGraph(MyClass.class);
eg.addAttributeNodes("id");
eg.addAttributeNodes("name");
eg.addAttributeNodes("relation");
Query q = em.createQuery("SELECT b FROM MyClass b");
q.setHint("javax.persistence.fetchgraph", eg);
List<MyClass> results = q.getResultList();
ただし、すべてのフィールドはデフォルトで読み込まれます。では、どのようにデフォルトですべてのフィールドの読み込みを無効にすることができますか? –
"fetchgraph"と "loadgraph"の違いは、コメント内のリンクを参照してください。JPA仕様のセクション3.7.4を参照してください。 –
JPAプロバイダが一方的に(つまり、fetchgraphを推薦するだけです)。私が使っているJPAプロバイダ(DataNucleus)は私の望みを尊重しています。本当にEntityGraphがIMHOを実行すべきものです。 –
Hibernateセッションでは、これは結果トランスフォーマを使用して取得できます。 HibernateはJPAの結果トランスをサポートしていません。
HHH-8196 Custom ResultTransformer for JPA criteria queries
あなたはセッションに結果変圧器を適用するためにunwrap(Session.class)
を使用することができます。
List<Person> persons = entityManager.unwrap(Session.class).
createQuery("select name as name from Person").
setResultTransformer(
Transformers.aliasToBean(Person.class)
).list();
フェッチ団体にグラフは、主に対象としている取得十分でした。
JPA仕様でフィールドがデフォルトで怠惰であると指定されている場合でも、LAZYはJPAプロバイダのヒントに過ぎず、無視することもできます。 Hibernateは、デフォルトでフィールドの遅延ロードを使用しません。デフォルトではone-to-many and many-to-many associations are LAZYのみです。
遅延フィールドを使用するには、enable bytecode enhancementが必要で、@LazyGroupも使用する必要があります。
とにかく、おそらくDTO projection queryが最初に必要なものです。
- 1. 実行時に定義されたフィールドシンボルにアクセスするABAP
- 2. Hibernate @Formula実行時に設定された値
- 3. 実行時にエンティティを設定する
- 4. 実行時に定義されたwpfデータグリッドにビットマップイメージを表示
- 5. 定義された時間にタスクを実行
- 6. Windowsサービスで定義された時間後にメソッドを実行
- 7. Hibernate - ロード時にオートワイアードフィールドを設定する
- 8. Hibernate:(エンティティ)スーパークラスのOneToManyマップされたフィールドをオーバーライドしますか?
- 9. 実行時に生成されたリポジトリとエンティティ
- 10. 実行時にアノテーションを定義する
- 11. JPA - 遅延ロードされたエンティティ参照にフィールドがありますnull
- 12. Hibernate注釈フィールド定義
- 13. ネストされたHibernateエンティティ
- 14. Hibernate High同時実行性とユーザ定義@ 012の意味
- 15. 実行時にテーブルへのHibernateエンティティのバインド
- 16. Hibernate 4でのエンティティの定義
- 17. エンティティに定義されていないフィールドを追加するには?
- 18. Angularjs - 再ロード時にNgTableが定義されていません
- 19. 実行時にシード値が定義され、変更されたランダムな出力を生成する
- 20. 定義されたループを実行すると、毎回異なる時刻が返されます
- 21. 実行時にどの依存関係がロードされているかを確認する(実行時に)
- 22. Hibernate =実行時のカスケードオプションの設定?
- 23. @ManyToOneフィールドによるHibernate @Filterエンティティ
- 24. 特定のページがロードされるたびにJSを実行する
- 25. Springバッチ:実行時に定義されたジョブのリストを取得
- 26. 定義されたプロパティでのみ実行するタスクを実行する
- 27. 実行時エラー1004.アプリケーション定義またはオブジェクト定義エラーVBA
- 28. 実行時エラー1004、アプリケーション定義またはオブジェクト定義エラー
- 29. 実行時エラー1004アプリケーション定義またはオブジェクト定義のエラー -
- 30. 実行時エラー '1004'アプリケーション定義またはオブジェクト定義
JPA EntityGraphsを使用しているとします。 –
@Neil Stockton EntityGraphsは、エンティティを読み込むためにのみ使用されますが、そのフィールドは表示されません。 –
ロードするフィールドを定義します。 http://www.datanucleus.org/products/accessplatform_5_0/jpa/entity_graphs.htmlしかし、フィールドXをロードしないと明言できないという弱点があります。 –