6

特定のNamedQueryに対して遅延読み込み戦略を適用するにはどうすればよいですか。

たとえば。以下の擬似コードを検討してください(ケースを説明するためだけに)私はエンティティを持っています

@Entity
class Xyz {
 int a;
 int b;

@Fetch = EAGER
 Set<ABC> listOfItems;
}

この場合、listOfItemsをEAGERLYフェッチするように宣言しました。

ここで、私が持っていると仮定NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") します。このクエリの場合、結果を怠惰にする必要があります。つまり、listOfItemsを取得したくありません。

私がそれらを達成することができる方法は何ですか?ps:1.EntityクラスでlistOfItemsをLazyに変更したくない2.クエリで特定のフィールドを選択したくないname="select a,b from Xyz z where a = ? "

提案を事前に感謝します

4

2 に答える 2

1

熱心にフェッチしたくない場合はSet、レイジーとして定義する必要があります。ただし、lazy を指定すると、実装は熱心にフェッチすることが許可されることに注意してください。

仕様の引用:

public enum FetchType extends java.lang.Enum

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

ただし、そのようなものを取得したくない場合はSet、代わりに、ニーズに合わせて小さなクラスを作成します。

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

TypedQuery を使用してこれを照会できます。

EntityManager em;
//....
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class)
q.setParameter("a", a);
于 2012-06-09T13:23:27.157 に答える
0

EclipseLinkを使用している場合は、フェッチ・グループを使用できます。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup

于 2012-06-11T13:55:50.477 に答える