1

私のエンティティには、次のような名前付きクエリがあります。

@NamedQuery(name = "Person.find", query = "select p from Organization p where p.name=:NAME")

私のコードでは、クエリ キャッシュ ヒントを設定します。

query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase");

結果リスト全体を取得しようとすると:

List<Person> result = query.getResultList();

EclipseLink は例外をスローします。

Exception [EclipseLink-6124] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.QueryException
Exception Description: Required query of class org.eclipse.persistence.queries.ReadAllQuery, found class org.eclipse.persistence.queries.ReadObjectQuery

単一の結果のみを取得しようとすると、次のように機能します。

Person person = query.getSingleResult();

クエリ ヒントを削除すると、getResultList() も機能します。

私は例外を理解していません - それは特に getResultList() を期待していると言っているのではありませんか?? 私は何を間違っていますか?

4

1 に答える 1

2

EclipseLinkのドキュメントには次のように書かれています:

「EclipseLink は、ネイティブ クエリ、またはデータや複数のオブジェクトを返すような複雑な結果セットを持つクエリのキャッシュの使用をサポートしていません。」

また、ドキュメントには次のように記載されています。

「CheckCacheThenDatabase – データベースにアクセスする前に、キャッシュを完全にチェックするように読み取りオブジェクト クエリを構成できます。」

そのため、動作は問題ないようです。例外が誤解を招くことがわかりました。

編集:エンティティ定義で次のようなことを試してください。これで十分です:(エラーが発生する可能性があるため、Webページでコード化されています)

Entity
@Cache(expiry = 3600000, // 1 hour size = 10000)
@NamedQueries({
  @NamedQuery(name = "Person.findByPK", query = "select p from Person p " +
  "where p.name=:NAME",
  hints = {
    @QueryHint(name = QueryHints.CACHE_USAGE,
    value = CacheUsage.CheckCacheThenDatabase),
    @QueryHint(name = QueryHints.QUERY_TYPE, value = QueryType.ReadObject)
  }
})
于 2009-03-23T11:01:10.097 に答える