プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle TopLinkの理解
12c (12.2.1.2.0)
E82674-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

9 問合せの理解

この章では、EclipseLinkを使用し、リレーショナルや非リレーショナルのデータ・ソースに対して、Java EEおよびJava EE以外のアプリケーションの両方で問合せを使用して、永続オブジェクトまたはデータを作成、読取り、更新および削除する方法について説明します。

この章の内容は次のとおりです。

9.1 問合せの概念

一般的に、データ・ソースの問合せとは、データ・ソースの内容に対する操作の実行、データ・ソースの内容との相互作用を意味します。これを行うには、次のことができる必要があります。

  • 問い合せるデータ・ソースのネイティブな構文で操作を定義します。

  • 制御された方法で操作を適用します。

  • 操作によって結果が返された場合は、それを管理します。

問合せがEclipseLinkキャッシュにどのような影響を与えるのかも考慮する必要があります。

この項では、次の内容を含む、EclipseLinkに固有の問合せの概念について説明します。

9.1.1 Callオブジェクト

Callオブジェクトは、データ・ソースに対する操作またはアクションをカプセル化します。EclipseLink APIによって、Structured Query Language (SQL)、Java Persistence Query Language (JPQL)、Extensible Markup Language (XML)などの様々なCallタイプが提供されます。

Callは、直接実行することも、あるいはEclipseLinkのDatabaseQueryオブジェクトのコンテキストで実行することもできます。

9.1.2 DatabaseQueryオブジェクト

DatabaseQueryオブジェクトは、追加のカスタマイズ・オプションや最適化オプションとCallでカプセル化した操作を関連付ける抽象オブジェクトです。EclipseLinkでは、これらのオプションをCallから分離することによって、すべてのCallタイプにわたって高度な問合せ機能を利用できます。

9.1.3 データ・レベルとオブジェクト・レベルの問合せ

問合せは、オブジェクトまたはデータに対して次のように定義できます。

  • オブジェクト・レベルの問合せは、オブジェクト固有で、データをドメイン・モデルのオブジェクトとして返します。これは、マップ済データ向きの問合せです。オブジェクト・レベルのDatabaseQuery問合せは、EclipseLinkで最も頻繁に使用されます。

  • データ・レベルの問合せは、データベース表を直接問い合せるために使用され、アンマップ・データを操作する場合に適切な方法です。

9.1.4 サマリー問合せ

データ・レベルの問合せはRAWデータを返し、オブジェクト・レベルの問合せはドメイン・モデルのオブジェクトを返しますが、サマリー問合せはオブジェクトに関するデータを返します。EclipseLinkでは、特定の属性のみが移入されたオブジェクトのセットを返す部分オブジェクト問合せと、オブジェクトのセットの特定の属性に関する要約(ロールアップ)データを返すレポート問合せが提供されます。

9.1.5 ディスクリプタ問合せマネージャ

特定のクラスに適用できる名前付き問合せを保存できるのみでなく、一般的なデータ・ソース操作用にEclipseLinkで定義されているデフォルトの操作をDescriptorQueryManagerによってオーバーライドすることもできます。

9.1.6 問合せキー

問合せキーとは、データベース・フィールド名の、スキーマ非依存の別名です。問合せキーを使用する場合、スキーマに依存しない別名を使用したフィールドを参照できます。リレーショナル・プロジェクトにかぎっては、EclipseLinkではマップした属性すべてに対して問合せキーを自動的に作成します。問合せキーの名前は、オブジェクト・モデルで指定されたクラス属性の名前です。

問合せキーは、クラス・ディスクリプタまたはインタフェース・ディスクリプタで構成できます。問合せキーは、式で使用することや、可変1対1マッピングを問い合せるために使用できます。

デフォルトでは、EclipseLinkによって、マップされたすべての属性の問合せキーが作成されますが、一部の環境では独自の問合せキーを追加すると役立つこともあります。

9.2 JPQL問合せについて

Java Persistence Query Language (JPQL)は、JPAによって定義された問合せ言語です。JPQLは、SQLとほぼ同じですが、表や列のかわりにオブジェクト、属性およびリレーションシップに対して動作します。JPQLは、読取り(SELECT)に加え、バルク更新(UPDATE)や削除(DELETE)のために使用できます。JPQLは、(注釈またはXMLを通じて) NamedQueryで使用するか、EntityManager createQuery() APIを通じて動的問合せで使用できます。

JPQLの短所は、動的問合せで、Webフォームや動的コンテンツから文字列を動的に連結して問合せを作成する必要があることです。また、JPQLは実行時までチェックされないので、タイプミスが多くなります。これらの短所は、9.4項「About the Criteria APIについて」で説明する問合せ基準APIを使用すればある程度補えます。

9.2.1 JPQLに対するEclipseLinkの拡張機能

EclipseLinkは、SELECT問合せ、更新および削除文、WHERE句、リテラル値およびデータベース関数など、JPA仕様の「Query Language」に記載されているあらゆる文および句をサポートしています。詳細は、JPA仕様を参照してください。

http://jcp.org/en/jsr/detail?id=338

EclipseLinkでは、標準のJPA JPQLに対する多くの拡張機能が提供されています。これらの拡張機能によって、その多くがSQL標準の一部である追加のデータベース機能に対するアクセス、ネイティブのデータベース機能および関数に対するアクセス、およびEclipseLink固有の機能に対するアクセスが提供されます。

EclipseLinkのJPQL拡張機能には次のものが含まれます。

  • JPQLより少ない制限で、LIKEINORDER BY、コンストラクタ、関数などの操作内で下位選択および関数を使用可能

  • <>のかわりに!=を使用可能

  • データベース固有の関数をコールできるFUNCTION操作

  • 継承のある関連エンティティをダウンキャストできるTREAT操作

  • EclipseLinkのデータベースに依存しない関数をコールできるOPERATOR操作

  • SQLとJPQLを組み合せることができるSQL操作

  • CASTおよびEXTRACT関数

  • 正規表現による問合せのためのREGEXP関数

  • SELECTおよびFROM句での下位選択の使用

  • JOINおよびLEFT JOIN条件を定義するためのON句のサポート

  • 独立エンティティ間の結合

  • JOIN FETCHでの別名の使用

  • マップされていない列での問合せを可能にするCOLUMN操作

  • マップされていない表での問合せを可能にするTABLE操作

  • UNIONINTERSECTEXCEPTのサポート

  • =、<>、INIS NULLおよびORDER BYでのオブジェクト変数の使用

これらの拡張機能の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のEclipseLinkの問合せ言語に関する項を参照してください。

9.2.2 JPQLでのEclipseLinkの特殊な演算子

EclipseLinkでは、基本的なJPQLでは使用できないデータベース操作を実行できる特殊なJPQL演算子がいくつか定義されています。これには次のものがあります。

  • COLUMN

  • FUNCTION

  • OPERATOR

  • SQL

これらの演算子の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』の特殊な演算子に関する項を参照してください。

9.3 SQL問合せ言語について

EclipseLinkを使用すると、次の問合せ言語を使用して問合せを表現できます。

SQLは、リレーショナル・データベース・データ・ソースを使用するアプリケーションで最も一般的な問合せ言語です。ほとんどの場合、特定の問合せ言語で問合せを直接構成できますが、可能であれば、適切なCallを使用してDatabaseQueryを構成し、Expressionオブジェクトを使用して選択基準を指定することをお薦めします。SQLで問合せを直接構成する方法が最も簡単な方法(簡単な操作またはアンマップ・データに対する操作)であるように思われますが、DatabaseQueryを使用した方法の場合、問合せをドメイン・オブジェクト・モデルに限定し、データ・ソース・スキーマ実装の詳細に依存しなくて済むという大きな利点があります。

問合せの構成には、Expressionを使用することをお薦めします。

SessionのメソッドexecuteSelectingCallおよびexecuteNonSelectingCallを使用してカスタムSQLを直接実行したり、適切なCallを使用してDatabaseQueryを構成することができます。

EclipseLinkでは、ストアド・プロシージャ、およびOracle Database、ストアド・ファンクションとともに使用できる様々なSQL Callオブジェクトを用意しています。EclipseLinkでは、PLSQLデータ・タイプを持つOracleストアド・プロシージャのPLSQLコールもサポートします。

9.3.1 ストアド・プロシージャ

JPA仕様(http://jcp.org/en/jsr/detail?id=338)の「Stored Procedures」の項に記載されているとおり、ネイティブSQLでは、動的に、またはNamedStoredProcedureQuery注釈で指定された名前付きストアド・プロシージャを使用できます。注釈を使用する場合、データベースにストアド・プロシージャが存在する必要があります。注釈を使用して、ストアド・プロシージャに対するすべてのパラメータのタイプ、対応するパラメータ・モードおよび結果セットのマッピングを指定できます。

StoredProcedureParameter注釈を使用して、すべてのパラメータに対してメタデータを提供する必要があります。パラメータは、ストアド・プロシージャのパラメータ・リストに記載されている順序で指定する必要があります。パラメータ名が使用される場合、パラメータ名を使用してパラメータ値をバインドし、出力値を抽出します(パラメータがINOUTまたはOUTパラメータの場合)。

ストアド・プロシージャがメタデータを使用して定義されていない場合は、パラメータおよび結果セット情報を動的に提供する必要があります。

9.3.1.1 ストアド・プロシージャに対するEclipseLinkの拡張機能

EclipseLinkには、PLSQLのストアド・プロシージャ(@NamedPLSQLStoredProcedureQueryなど)およびストアド・ファンクション(@NamedPLSQLStoredFunctionQueryなど)を使用できる、注釈の拡張機能が定義されています。PLSQL注釈により、JDBCからアクセスできないRECORDおよびTABLEなどの複合PLSQLタイプを使用できます。注釈には、ファンクション(またはプロシージャ)名、ストアド・ファンクションの戻り値、問合せヒント、ストアド・ファンクションのパラメータおよびSQLResultMappingの名称を指定するための属性が含まれています。

ストアド・ファンクション(またはプロシージャ)に対するパラメータは、@PLSQLParameter注釈とともに指定します。@PLSQLRecord注釈は、PLSQLプロシージャで使用するための、データベースPLSQLのRECORDタイプを定義します。

EclipseLinkには、PLSQLではないストアド・プロシージャ(@NamedStoredProcedureQueryなど)およびストアド・ファンクション(@NamedStoredFunctionQueryなど)を使用できる、注釈の拡張機能も定義されています。

ストアド・プロシージャに対するEclipseLinkの拡張機能のリストおよび説明へのリンクは、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のストアド・プロシージャおよびファンクションの注釈に関する項を参照してください。

9.4 Criteria APIについて

Java Persistence Criteria APIを使用すると、JPQLの文字列ベースのアプローチを使用せずに、オブジェクトベースの問合せ定義オブジェクトを構成して動的問合せを定義できます。Criteria APIによって、文字列ベースの第4世代言語アプローチよりJava言語との統合が容易になる動的問合せをプログラム的に作成できます。

Criteria APIには、タイプ制限モードとタイプなしモードという2つのモードがあります。タイプ制限モードでは、JPAメタモデルで生成されたクラスのセットを使用して、クラスの問合せ可能な属性を定義します。タイプなしモードでは、文字列を使用してクラスの属性を参照します。

Criteria APIは、動的問合せ専用で、メタデータまたは名前付き問合せでは使用できません。基準問合せは、動的問合せであり、静的な名前付き問合せや、EclipseLinkの解析キャッシュの利点を得ることができるパラメータ化された動的JPQLほどのパフォーマンスは得られません。

詳細は、JPA仕様の第6章「Criteria API」を参照してください。

http://jcp.org/en/jsr/detail?id=338

CriteriaBuilderは、Criteria APIの主要インタフェースです。CriteriaBuilderは、getCriteriaBuilder() APIを使用してEntityManagerまたはEntityManagerFactoryから取得されます。CriteriaBuilderを使用して、CriteriaQueryオブジェクトとその式を作成できます。Criteria APIでは、現在、選択問合せのみがサポートされます。

CriteriaQueryは、データベースの選択問合せを定義します。CriteriaQueryは、JPQL選択問合せのすべての句をモデル化します。あるCriteriaQueryの要素は、他のCriteriaQuerysで使用できません。CriteriaQueryは、EntityManager createQuery() APIとともに使用して、JPA問合せを作成できます。

where句は、返される結果をフィルタする条件(述語)を定義するため、通常は問合せの主要部分です。where句は、任意のPredicateオブジェクトでCriteriaQueryに対してwhere APIを使用することで定義されます。Predicateは、CriteriaBuilderに対して比較操作または論理操作を使用することで取得されます。isNullisNotNullおよびin操作は、Expressionオブジェクトに対してもコールできます。not操作は、Predicateオブジェクトに対してもコールできます。

副問合せは、Criteria APIのselectwhereordergroup byまたはhaving句で使用できます。副問合せは、subquery操作を使用してCriteriaQueryから作成されます。ほとんどのsubqueryの使用法では、CriteriaBuilderexistsallanyまたはsome操作か、in操作とともに使用しないかぎり、副問合せは単一の結果および値を返すように制限されます。

パラメータは、CriteriaBuilderparameter APIを使用することで定義できます。JPAでは、名前付きパラメータと位置パラメータが定義されています。名前付きパラメータでは、パラメータのタイプと名前が指定されます。位置パラメータでは、パラメータのタイプのみが指定されます。位置パラメータは、位置0ではなく1から開始します。

Criteria APIでは、いくつかのデータベース関数がサポートされます。サポートされるすべての関数は、CriteriaBuilderで定義されます。一部の関数は、SQL準拠でない場合、一部のデータベースでサポートされないことがあり、同等の関数も提供されません。

Criteria APIでは、データベース関数ではない特殊な操作がいくつか定義されていますが、これらはJPAでは特殊な意味を持ちます。これらの操作の一部はCriteriaBuilderで定義され、一部は特定のExpressionインタフェースで定義されます。

JPAでは、ORMマッピング・メタデータの情報を問い合せるために実行時に使用できるメタモデルが定義されています。メタモデルには、クラスのマップ済属性のリストや、そのマッピングのタイプおよびカーディナリティが含まれます。メタモデルは、文字列を使用してクラス属性を参照するかわりに、Criteria APIと組み合せて使用できます。

JPAでは、コンパイル時にメタモデルにアクセスできる、JPAプロバイダ(IDE)によって生成される一連の"_"クラス(_MyEntity.javaなど)が定義されています。これによって、Criteria APIで型指定の静的変数を使用できます。これによって、テスト時ではなくコンパイル時に問合せの問題を捕捉することで、タイプミスの発生やアプリケーション・コードでの無効な問合せを削減できます。ただし、この場合、メタモデルの静的クラスを生成して開発サイクルの一部にする必要があるため、開発プロセスが複雑になります。

タプルでは、複数選択の問合せ結果が定義されます。通常、オブジェクト配列は、JPAの複数選択問合せによって返されますが、オブジェクト配列はそれほど有益なデータ構造ではありません。タプルは、名前または索引で結果を取得できるマップ状の構造です。

9.4.1 Criteria APIに対するEclipseLinkの拡張機能

EclipseLinkのCriteria APIサポートにおける制限は、JPAの指定より少なくなっています。一般的に、副問合せおよびオブジェクト・パス式は、次のようにほとんどの場所で許可されます。

  • select、group byおよびorder句での副問合せ

  • 関数と組み合せた副問合せの使用

  • オブジェクト・パス式と組み合せた使用

  • オブジェクト・パス式と組み合せたOrder byの使用

EclipseLinkのCriteria APIサポートは、EclipseLinkのネイティブExpression APIを基盤として成立しています。EclipseLinkには、JPA Expressionオブジェクトを対象としたネイティブのExpressionオブジェクトの変換を可能にするJpaCriteriaBuilderインタフェースが用意されています。これによって、EclipseLinkのネイティブのExpression APIをJPAのCriteria APIと組み合せることができます。

EclipseLinkのネイティブのExpression APIでは、次の追加機能が提供されます。

  • 追加のデータベース関数(80を超えるデータベース関数のサポート)

  • カスタムのExpressionOperatorsの使用

  • Expression問合せ内へのSQLの埋込み

  • from句での下位選択の使用

  • ON句のサポート

  • マップされていない列および表へのアクセス

  • 履歴問合せ

EclipseLinkのExpressionsは、EclipseLinkのDatabaseQuerysと組み合せて追加機能を提供できます。

  • union、intersectおよびexcept句

  • 句による階層接続

  • 一括フェッチ

9.5 ネイティブSQL問合せについて

JPAでは、エンティティ・オブジェクトまたはデータの問合せにSQLを使用できます。SQL問合せは、変換されずにデータベースに直接渡されます。SQL問合せは、データベース固有の構文を必要とする高度な問合せのために使用するか、JPQLやJavaよりSQL言語に慣れているユーザーによって使用できます。

SQL問合せは、createNativeQuery APIまたは名前付き問合せを使用してEntityManagerから作成されます。問合せオブジェクトは、他の任意のJPA問合せと同じように返され、実行されます。SQL問合せは、エンティティ・クラス用に作成することや、データのオブジェクト配列を返すことができます。エンティティを返す場合、SQL問合せによってエンティティのマッピングが予期している列名を返す必要があります(または、SqlResultSetMappingを使用できます)。SqlResultSetMappingでは、SQLの結果セットをエンティティ(またはエンティティおよびデータのセット)にマップできます。

SQL問合せを使用して、SQLまたはDML (データ操作言語)文を実行できます。結果を返すSQL問合せでは、getSingleResultまたはgetResultListを使用できます。結果を返さないSQL問合せでは、executeUpdateを使用する必要があります。executeUpdateは、トランザクション内でのみ使用できます。SQL問合せを使用して、データベース操作と、一部のストアド・プロシージャおよびファンクションを実行できます。出力パラメータを返すストアド・プロシージャまたは一部の複雑なストアド・プロシージャは、SQL問合せでは実行できません。

SQL問合せのパラメータは、疑問符(?)を使用して区切る必要があります。索引付きパラメータのみがサポートされ、名前付きパラメータはサポートされません。索引は、?1などのデリミタで使用できます。パラメータ値は、setParameter APIを使用して問合せに設定されます。索引付きパラメータは、索引0ではなく1から開始します。

ネイティブSQL問合せは、NamedNativeQuery注釈または<named-native-query> XML要素を使用して注釈またはXMLで名前付き問合せとして定義できます。名前付きのネイティブSQL問合せは、任意の名前付き問合せと同じように実行されます。

結果列の名前が、エンティティ・マッピングで予期されている内容と一致しない場合、SqlResultSetMappingを使用してSQL問合せの結果をエンティティにマップできます。これは、単一のSQL問合せから複数のエンティティ(またはエンティティおよびデータ)を返す場合にも使用できます。EntityResultおよびFieldResultを使用して、エンティティ属性にSQL問合せの結果列をマップできます。ColumnResultを使用して、結果にデータ要素を追加できます。

SqlResultSetMappingsは、@SqlResultSetMapping注釈または<sql-result-set-mapping> XML要素を使用して、注釈またはXMLを通じて定義されます。これらは、名前を通じてネイティブSQL問合せから参照されます。

9.5.1 ネイティブ問合せサポートに対するEclipseLinkの拡張機能

EclipseLinkの式を使用すると、ドメイン・オブジェクト・モデルに基づいて問合せの検索基準を指定できます。問合せを実行する際、EclipseLinkではこれらの検索基準を、使用しているプラットフォームに適した問合せ言語に変換します。

EclipseLink APIは、式をサポートする次の2種類のパブリック・クラスを提供します。

  • Expressionクラスは、単純な定数からブール・ロジックを伴う複雑な句まで、あらゆる式を表します。式の操作、グループ化および統合を行うことができます。

  • ExpressionBuilderクラスは、新しい式を構成するためのファクトリです。

選択基準は、DatabaseQueryのメソッドsetSelectionCriteria,を使用してExpressionとして指定したり、Expressionを取るファインダに指定できます。

EclipseLinkの式の使用方法の詳細は、第10章「EclipseLinkの式の理解」を参照してください。

9.6 問合せヒントについて

問合せヒントを使用して、JPA問合せをカスタマイズまたは最適化できます。NamedQuery注釈を使用して、Java永続性問合せ言語で名前付き問合せを指定します。この注釈には、問合せプロパティおよびヒントの指定に使用できる、hints要素が含まれます。この注釈の詳細は、JPA仕様の「NamedQuery Annotation」を参照してください。

http://jcp.org/en/jsr/detail?id=338

問合せヒントの定義はベンダー固有です。次の各項では、JPA問合せヒントおよびEclipseLink問合せヒントを説明します。

9.6.1 JPAのキャッシュ問合せヒント

JPAの問合せヒントでは、問合せまたはfind()演算は共有キャッシュをバイパスまたはリフレッシュできます。JPAのキャッシュ問合せヒントは、名前付きまたは動的問合せにセットすることも、find()操作に渡されるプロパティ・マップにセットすることもできます。

JPA 2.0は、共有キャッシュと問合せの対話を構成するため、次の問合せヒント・プロパティを定義しています。

  • javax.persistence.cache.retrieveMode

  • javax.persistence.cache.storeMode

9.6.2 キャッシュ問合せヒントに対するEclipseLinkの拡張機能

EclipseLinkのキャッシュ問合せヒントでは、問合せまたはfind()演算は、次の方法でキャッシュと対話することができます。

  • キャッシュ・チェックをバイパスし、データベースへのアクセスを強制しますが、まだキャッシュにより解決しています。

  • データベース結果からキャッシュをリフレッシュします。

  • キャッシュおよび永続性ユニットをバイパスし、デタッチされたオブジェクトを返します。

  • 永続性コンテキストをバイパスし、読取り専用オブジェクトを返します。

  • 問合せがIdフィールドおよびその他のフィールドを使用して、キャッシュ・ヒットを取得できるようにします。

  • 最初にキャッシュの問合せを行い、オブジェクトが見つからない場合のみ、データベースにアクセスします。

  • キャッシュの問合せのみを行い、データベースへのアクセスを回避します。

  • 問合せを永続性コンテキストのフラッシュされていない変更に適合させます。

キャッシュにアクセスする問合せには、次の制限事項があります。

  • サブセレクトはサポートされていません。

  • サポートされないデータベース関数もあります。

  • 問合せはオブジェクトの単一セットである必要があります。

  • グループ化はサポートされていません。

  • インスタンス化されていないLAZYリレーションシップに対する問合せを行うことはできません。

EclipseLinkのすべての問合せヒントは、org.eclipse.persistence.configパッケージのQueryHintsクラスで定義されます。ヒントを設定する場合、次のようなorg.eclipse.persistence.configパッケージの適切な構成クラスのpublic static finalフィールドを使用して、値を設定できます。

  • HintValues

  • CacheUsage

  • PessimisticLock

  • QueryType

@QueryHint注釈を使用して、orm.xmlまたはeclipselink-orm.xmlファイルにヒントを含めて、または名前付きまたは動的問合せ(JPQLまたはCriteria)の実行時にsetHint()メソッドを使用して、EclipseLinkの問合せヒント(JPA問合せ拡張機能)を指定できます。

生成されるSQLに影響する問合せ設定および問合せヒントは、SQL問合せではサポートされません。サポートされない問合せヒントには、次のものがあります。

  • batch

  • history.as-of

  • inheritance.outer-join

  • sql.hint

  • join-fetch: join-fetchはサポートされますが、SQLですべての結合列を選択する必要があります。

  • fetch-group: fetch-groupはサポートされますが、SQLですべてのフェッチ列を選択する必要があります。

  • pessimistic-lock: pessimistic-lockはサポートされますが、SQLで結果行をロックする必要があります。

これらの拡張機能の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のEclipseLinkの問合せ言語に関する項を参照してください。

9.7 問合せのキャストについて

問合せのキャストを使用して、JPAまたはORMの使用時にサブクラスの属性全体を問い合せます。この機能は、JPQL、EclipseLinkの式およびCriteria APIで使用できます。

JPA 2.0以上では、結果または問合せを特定のサブクラスのものに制限できます。たとえば、式フレームワークでは、Expression.type(Class)が提供されます。

JPQLでは、ダウンキャストは、JOIN句のTREAT...ASを使用して、FROM句で実行されます。

JPA Criteria APIには、キャスト演算子のExpression.as(type)が含まれます。この式では、汎用内でタイプの一致を可能にする単純なキャストが実行されます。

JOINノードでキャストをコールすると、そのノードは永続的に変更されます。たとえば、前述の例では、join.as(LargeProject.class)のコール後に、結合はLargeProjectを参照します。

9.7.1 ダウンキャスト用のEclipseLinkの式のサポート

EclipseLinkは、Expression.as(type)を使用してキャストを実行できるようにCriteria APIを拡張しています。asメソッドによって階層が確認され、タイプがコールされている式のタイプのサブクラスである場合、キャストが実装されます。

Expression.as(Class)は、ダウンキャストにも使用できます。Expression.as(Class)を使用する場合の動作は、次のとおりです。

  • キャスト先のクラスが、キャスト対象の問合せキーのクラスのサブクラスではない場合、問合せ実行時に例外がスローされます。

  • キャストは、ObjectExpressions (QueryKeyExpressionおよびExpressionBuilder)でのみ許可されます。キャストの親の式は、ObjectExpressionとする必要があります。

  • キャストでは、変更されるObjectExpressionと同じ外部結合設定を使用します。

  • キャストでは、親の式を変更します。その結果、パラレル式でキャストを使用する場合、親の式の新しいインスタンスを使用する必要があります。

  • キャストは、TablePerClass継承ではサポートされません。

  • キャストを実行する問合せでは、タイプを慎重に確認してください。

  • EclipseLinkでは、キャストで単一のタイプが生成される場合、自動的にタイプ情報が追加されますが、階層の中間にあるクラスの場合、タイプ情報はSQLに追加されません。

9.8 問合せ用のOracle拡張機能について

EclipseLinkをOracle Databaseとともに使用する場合は、EclipseLinkアプリケーション内から次のOracle固有の問合せ機能を使用できます。

9.8.1 問合せヒント

Oracleでは、データベース・サーバーのSQLオプティマイザの動作を変更できる、ヒントというSQL問合せの追加機能を指定できます。これを使用すると、通常オプティマイザで行われる設定を変更できます。ヒントを使用して、結合文の結合順序やSQLコールの最適化方法などを指定します。

ヒントを指定するには、EclipseLinkのDatabaseQueryのメソッドsetHintStringを使用します。

詳細は、使用しているデータベースのパフォーマンス・チューニング・ガイドを参照してください。

9.8.2 階層問合せ

Oracleデータベースの階層問合せメカニズムを使用すると、階層順序に基づいてデータベースの行を選択できます。たとえば、特定の従業員の行、その従業員が管理する人々の行、その人々に管理される従業員の行などの順序で読取りを行う問合せを設計できます。

EclipseLinkに表示される、DatabaseQueryのサブクラスReadAllQueryのメソッドsetHierarchicalQueryClauseを使用して、階層問合せ句を指定します。

9.8.3 フラッシュバック問合せ

EclipseLinkをOracle9i Database以降とともに使用する場合、特別な履歴セッションを取得できます(このセッションでは、過去の特定時刻までのすべてのオブジェクトが読み取られ、ある期間にどのようにオブジェクトが変更されているかについての条件を付けた読込み問合せを表現できます)。詳細は、Oracle Databaseアドバンスト・アプリケーション開発者ガイドのOracle Flashback Technologyの使用に関する項を参照してください。

9.8.4 ストアド・ファンクション

ストアド・ファンクションは、ストアド・プロシージャは、値を返すことに加え、すべての機能を提供するOracle Databaseのメカニズムです。ストアド・プロシージャとともに使用する注釈だけでなく、ストアド・ファンクションとともに使用する多数の注釈をも提供します。ストアド・ファンクションおよびプロシージャに対するEclipseLinkの注釈の拡張機能のリストおよび説明へのリンクは、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のストアド・プロシージャおよびファンクションの注釈に関する項を参照してください。