2016-05-05 10 views
3

10個のフィールドを持つエンティティがあるとします。これらのフィールドのほとんどすべてが非常に大きなデータを持っているとしましょう。また、エンティティ(フィールドのセットではありません)をロードし、実行時にロードするフィールドを定義します。私が見つけた解決策https://stackoverflow.com/a/24710759/5057736は、コンストラクタを使うことを示唆しています。しかし、10フィールドの場合、実行時にフィールドを定義する必要があることは解決策ではありません。 jpa 2.1を使ってこの問題を解決する方法はありますか?Hibernate - 実行時にフィールドが定義されたエンティティをロードする

+0

JPA EntityGraphsを使用しているとします。 –

+0

@Neil Stockton EntityGraphsは、エンティティを読み込むためにのみ使用されますが、そのフィールドは表示されません。 –

+0

ロードするフィールドを定義します。 http://www.datanucleus.org/products/accessplatform_5_0/jpa/entity_graphs.htmlしかし、フィールドXをロードしないと明言できないという弱点があります。 –

答えて

2

クエリによって取得するフィールドを定義する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(); 
+0

ただし、すべてのフィールドはデフォルトで読み込まれます。では、どのようにデフォルトですべてのフィールドの読み込みを無効にすることができますか? –

+0

"fetchgraph"と "loadgraph"の違いは、コメント内のリンクを参照してください。JPA仕様のセクション3.7.4を参照してください。 –

+0

JPAプロバイダが一方的に(つまり、fetchgraphを推薦するだけです)。私が使っているJPAプロバイダ(DataNucleus)は私の望みを尊重しています。本当にEntityGraphがIMHOを実行すべきものです。 –

1

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(); 

Additional information about nested projections

1

フェッチ団体にグラフは、主に対象としている取得十分でした。

JPA仕様でフィールドがデフォルトで怠惰であると指定されている場合でも、LAZYはJPAプロバイダのヒントに過ぎず、無視することもできます。 Hibernateは、デフォルトでフィールドの遅延ロードを使用しません。デフォルトではone-to-many and many-to-many associations are LAZYのみです。

遅延フィールドを使用するには、enable bytecode enhancementが必要で、@LazyGroupも使用する必要があります。

とにかく、おそらくDTO projection queryが最初に必要なものです。

関連する問題