2012-06-09 11 views
6

与えられたNamedQueryのためだけにレイジーローディング戦略を実施するにはどうすればよいですか?JPA - 指定されたクエリに対してのみレイジーロードを実行する

たとえば、以下の擬似コードを考えてみましょう(念を説明するために) 私はこの場合、エンティティ

@Entity 
class Xyz { 
int a; 
int b; 

@Fetch = EAGER 
Set<ABC> listOfItems; 
} 

を持って、私たちは熱心にフェッチするlistOfItemsを宣言しました。

ここで、私はNamedQuery (query="getXyz" , name="select x from Xyz x where a=?") とします。このクエリでは、結果が怠け者である必要があります。つまり、listOfItemsを取得したくありません。

私はそれらを達成する方法は何ですか? PS:私は、私が提案

+0

NamedQueryの結果はどうしますか?あなたが達成しようとしているものに代わるものがあるかもしれません。 – siebz0r

+0

@ siebz0r私はちょうど表示のための最初のレベルのフィールドが必要です。一方、セットを取得する必要がある他のディスプレイがあります。私の場合、私は熱心にそれらをフェッチしないことによってパフォーマンスを改善したいと思います。提案がある場合は、共有してください。ありがとう! –

+0

私は怠惰なセットとして注釈を付けることをお勧めします。これはなぜできないのですか? – siebz0r

答えて

1

場合は、事前にname="select a,b from Xyz z where a = ? "

おかげのように、クエリ内の特定のフィールドを選択したくない 2. Entityクラスに怠惰なことlistOfItemsを変更したくない 1あなたは熱心にそれを怠け者として定義しなければならないSetをフェッチしたくありません。ただし、lazyを指定したときは、実装が熱心にフェッチできることに注意してください。指定クォート

:FetchType

パブリック列挙はjava.lang.Enum

は、データベースからデータをフェッチするための戦略を定義して延びています。 EAGER戦略は、データを熱心に取得する必要がある持続性プロバイダの実行時の要件です。 LAZY戦略は、データが最初にアクセスされたときに遅延的にフェッチされるべきであるという持続性プロバイダのランタイムへのヒントです。実装は、LAZY戦略のヒントが指定されているデータを熱心に取得することが許可されています。

あなたはしかし、私は代替として、あなたのニーズに合わせて、小さなクラスを作成することになり、このようなSetをフェッチしたくない場合は、次の

@Entity 
@Table(name = "XYZ") 
public class XyzStub 
{ 
    int a; 
    int b; 
} 

あなたはTypedQueryを使用して、このために問い合わせることができます。

あなたがのEclipseLinkを使用している場合は、グループをフェッチ使用することができます
EntityManager em; 
//.... 
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class) 
q.setParameter("a", a); 
関連する問題