ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス
12c (12.1.2)
E48005-01
  目次へ移動
目次

前
 
次
 

@AdditionalCriteria

@AdditionalCriteriaを使用して、データに対するパラメータ化された表示を定義します。

エンティティまたはマップされたスーパークラスに対して、追加基準を定義できます。追加基準の定義は、マップされたスーパークラス・レベルで指定すると、エンティティによって独自の追加基準が定義されている場合(この場合、マップされたスーパークラスに定義された基準は無視されます)を除き、すべての継承エンティティに適用されます。

注釈要素

表2-1は、この注釈の要素を示しています。

表2-1 @AdditionalCriteriaの注釈要素

属性 説明 デフォルト

value

(必須)追加基準として使用するJPQLフラグメント



使用方法

追加基準により、問合せに追加のフィルタリング・メカニズムを提供できます。このフィルタリング・オプションには、たとえば、エンティティまたはマップされたスーパークラスに定義された、既存の追加のJOIN式を使用したり、パラメータを渡すことができます。

追加基準のパラメータは、エンティティ・マネージャ・ファクトリまたはエンティティ・マネージャのプロパティを介して設定します。エンティティ・マネージャで設定されたプロパティは、エンティティ・マネージャ・ファクトリで設定された同じ名前のプロパティ・セットをオーバーライドします。問合せを実行する前に、エンティティ・マネージャでプロパティを設定する必要があります。エンティティ・マネージャの存続期間のプロパティは変更しないでください。


注意:

追加基準は、ネイティブSQL問合せではサポートされていません。


@AdditionalCriteria注釈または<additional-criteria>要素を使用して、追加基準を指定します。追加基準の定義では、すべての有効なJPQL文字列がサポートされており、追加基準を形成するために、別名としてthisを使用する必要があります。次に例を示します。

@AdditionalCriteria("this.address.city IS NOT NULL")

例2-1に、エンティティEmployeeに対して定義された追加基準を示し、次に、エンティティ・マネージャに対して設定された追加基準のパラメータを示します。

例2-1 @AdditionalCriteria注釈の使用

次のように、Employeeに対して追加基準を定義します。

package model;
 
@AdditionalCriteria("this.company=:COMPANY")
public class Employee {

  ...
}

EntityManagerに対してプロパティを設定します。この例では、MyCompanyのすべての従業員が戻されます。

entityManager.setProperty("COMPANY", "MyCompany");

例2-2では、前と同じ例を示しますが、eclipselink-orm.xmlマッピング・ファイルの<additional-criteria>要素を使用します。

例2-2 <additional-criteria> XMLの使用

<additional-criteria>
  <criteria>this.address.city IS NOT NULL</criteria>
</additional-criteria>

追加基準の用途

追加基準には、次のような用途があります。

マルチテナンシ

マルチテナンシ環境では、テナント(ユーザー、クライアント、組織、アプリケーション)はデータベース表を共有できますが、データの表示は、テナントがそれ自身のデータにのみアクセスできるように制限されます。追加基準を使用して、そのような制限を構成できます。


注意:

ほとんどの場合、次に示すとおり、マルチテナンシ環境では、かわりに@Multitenant注釈を使用します。


例2-3 マルチテナンシの例1

次の例では、請求アプリケーションまたは請求組織などのBillingクライアントのデータを制限します。

@AdditionalCriteria("this.tenant = 'Billing'")

例2-4 マルチテナンシの例2

次の例は、同時に複数のテナントによって使用されるアプリケーションで使用できます。追加基準は、次のように定義されます。

@AdditionalCriteria("this.tenant = :tenant")

テナントがEntityManagerFactoryまたはEntityManagerを取得すると、永続性/エンティティ・マネージャ・プロパティのテナントが、それを取得しているテナントの名前に設定されます。次に例を示します。

Map properties = new HashMap();
properties.put("tenant", "ACME");
EntityManagerFactory emf = Persistence.createEntityManagerFactory(properties);

または

Map properties = new HashMap();
properties.put("tenant", "ACME");
EntityManager em = factory.createEntityManager(properties);

ソフト削除

次の例では、削除するようにマークされている(ものの、表に存在する)データを問合せからフィルタリングします。

@AdditionalCriteria("this.isDeleted = false")

データ履歴

次の例では、問合せから最新データを戻すことによって、履歴表に格納されているデータなどの最新でないデータをフィルタリングします。

@AdditionalCriteria("this.endDate is null")

注意:

TopLinkは、HistoryPolicy経由で特定の履歴サポートも提供しています。詳細は、『Oracle TopLinkの理解』の履歴ポリシーに関する項を参照してください。


一時的なフィルタリング

次の例では、特定の日付にフィルタリングします。

@AdditionalCriteria("this.startDate <= :viewDate and this.endDate >= :viewDate")

共有表

共有表では、表に継承があり、オブジェクト・モデルにはない場合があります。たとえば、SavingsAccountクラスがACCOUNT表にマップされており、ACCOUNT表には預金口座データ(SAVINGS)と当座預金口座データ(CHECKING)の両方が含まれている場合があります。追加基準を使用して、当座預金口座データをフィルタリングできます。

関連項目

詳細は、次を参照してください。