Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.1.2) E48005-01 |
|
![]() 前 |
![]() 次 |
@AdditionalCriteria
を使用して、データに対するパラメータ化された表示を定義します。
エンティティまたはマップされたスーパークラスに対して、追加基準を定義できます。追加基準の定義は、マップされたスーパークラス・レベルで指定すると、エンティティによって独自の追加基準が定義されている場合(この場合、マップされたスーパークラスに定義された基準は無視されます)を除き、すべての継承エンティティに適用されます。
注釈要素
表2-1は、この注釈の要素を示しています。
使用方法
追加基準により、問合せに追加のフィルタリング・メカニズムを提供できます。このフィルタリング・オプションには、たとえば、エンティティまたはマップされたスーパークラスに定義された、既存の追加の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>
追加基準の用途
追加基準には、次のような用途があります。
マルチテナンシ
マルチテナンシ環境では、テナント(ユーザー、クライアント、組織、アプリケーション)はデータベース表を共有できますが、データの表示は、テナントがそれ自身のデータにのみアクセスできるように制限されます。追加基準を使用して、そのような制限を構成できます。
例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は、 |
一時的なフィルタリング
次の例では、特定の日付にフィルタリングします。
@AdditionalCriteria("this.startDate <= :viewDate and this.endDate >= :viewDate")
共有表
共有表では、表に継承があり、オブジェクト・モデルにはない場合があります。たとえば、SavingsAccount
クラスがACCOUNT
表にマップされており、ACCOUNT
表には預金口座データ(SAVINGS
)と当座預金口座データ(CHECKING
)の両方が含まれている場合があります。追加基準を使用して、当座預金口座データをフィルタリングできます。
関連項目
詳細は、次を参照してください。