プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス
12c (12.2.1.2.0)
E82670-01
  目次へ移動
目次

前
 
次
 

3 Java永続性問合せ言語の拡張機能

この章では、標準のJPA Java永続性問合せ言語(JPQL)に対するEclipseLinkの拡張機能について説明します。EclipseLink問合せ言語(EQL)と呼ばれるこれらの拡張機能は、その多くが標準SQLの一部である追加データベース機能へのアクセス、ネイティブなデータベース機能や関数へのアクセス、およびEclipseLink固有機能へのアクセスを提供します。

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

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

3.1 特殊な演算子

EclipseLinkは、標準JPQLでは不可能なデータベース操作を実行するために次の演算子を定義します。

3.2 EclipseLink問合せ言語

EclipseLinkは、次のEclipseLink EQL関数へのアクセスを提供しています。

CAST

CASTを使用して、値を特定のデータベース・タイプに変換します。

使用方法

CAST関数は、データベースに依存しませんが、データベースのサポートを必要とします。

例3-1に、このJPQLの拡張機能を使用する方法を示します。

例3-1 CAST EQLの使用

CAST(e.salary NUMERIC(10,2))

COLUMN

COLUMNを使用して、オブジェクト表のマップされていない列にアクセスします。

使用方法

COLUMNを使用して、外部キー列、継承識別子またはプリミティブ列(ROWIDなど)にアクセスできます。@AdditionalCriteria注釈内のJPQLフラグメントでCOLUMNを使用することもできます。

例3-2に、COLUMN EQLを使用する方法を示します。

例3-2 COLUMN EQLの使用

SELECT e FROM Employee e WHERE COLUMN('MANAGER_ID', e) = :id

例3-3では、COLUMN EQLを使用してプリミティブ列(ROWID)にアクセスします。

例3-3 COLUMNとプリミティブ列の使用

SELECT e FROM Employee e WHERE COLUMN('ROWID', e) = :id

関連項目

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

EXCEPT

複数の問合せを実行する際に、EXCEPTを使用して、最初の問合せの結果から2つ目の問合せの結果を削除します。

使用方法

EXCEPT関数は、データベースに依存しませんが、データベースのサポートを必要とします。

例3-4に、このJPQLの拡張機能を使用する方法を示します。

例3-4 EXCEPT EQLの使用

SELECT e FROM Employee e
EXCEPT SELECT e FROM Employee e WHERE e.salary > e.manager.salary

関連項目

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

EXTRACT

EXTRACTを使用して、日時値の日付部分を取得します。

使用方法

EXTRACT関数は、データベースに依存しませんが、データベースのサポートを必要とします。

例3-5に、このJPQLの拡張機能を使用する方法を示します。

例3-5 EXTRACT EQLの使用

EXTRACT(YEAR, e.startDate)

FUNCTION

FUNCTION (以前のFUNC)を使用して、JPQLからデータベース固有の関数をコールします。

使用方法

FUNCTIONを使用して、JPQLで直接サポートされていないデータベース関数をコールしたり、ユーザーまたはライブラリ固有の関数をコールできます。


注意:

FUNCTIONは、データベース固有です。他のJPQL関数とは異なり、別のデータベースをサポートするために関数のコールを変換しません。

FUNCTION関数を使用して、通常の構文で関数をコールします。特別な構文が必要な関数は、FUNCTIONでコールできません。かわりに、OPERATORを使用します。

例3-6に、このJPQLの拡張機能を使用する方法を示します。

例3-6 FUNCTION EQLの使用

SELECT p FROM Phone p WHERE FUNCTION('TO_NUMBER', e.areaCode) > 613
 
SELECT FUNCTION('YEAR', e.startDate) AS year, COUNT(e) FROM Employee e GROUP BY year

例3-7に、Oracle空間問合せとともにFUNCTIONを使用する方法を示します。

例3-7 FUNCTION EQL Oracle空間の使用例

SELECT a FROM Asset a, Geography geo WHERE geo.id = :id AND a.id IN :id_list AND FUNCTION('ST_INTERSECTS', a.geometry, geo.geometry) = 'TRUE'
SELECT s FROM SimpleSpatial s WHERE FUNCTION('MDSYS.SDO_RELATE', s.jGeometry, :otherGeometry, :params) = 'TRUE' ORDER BY s.id ASC

関連項目

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

INTERSECT

複数の問合せを実行する際に、INTERSECTを使用して両方の問合せで検出された結果のみを戻します。

例3-8に、このJPQLの拡張機能を使用する方法を示します。

例3-8 INTERSECT EQLの使用

SELECT MAX(e.salary) FROM Employee e WHERE e.address.city = :city1
UNION SELECT MAX(e.salary) FROM Employee e WHERE e.address.city = :city2
SELECT e FROM Employee e JOIN e.phones p WHERE p.areaCode = :areaCode1
INTERSECT SELECT e FROM Employee e JOIN e.phones p WHERE p.areaCode = :areaCode2
SELECT e FROM Employee e
EXCEPT SELECT e FROM Employee e WHERE e.salary > e.manager.salary

関連項目

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

ON

ON句を使用して、外部結合のためなどにJOIN条件に他の条件を追加します。

使用方法

EclipseLinkでは、2つのルート・レベル・オブジェクト間でのON句の使用がサポートされています。

例3-9に、このJPQLの拡張機能を使用する方法を示します。

例3-9 ON句のEQの使用

SELECT e FROM Employee e LEFT JOIN e.address ON a.city = :city
SELECT e FROM Employee e LEFT JOIN MailingAddress a ON e.address = a.address

関連項目

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

OPERATOR

OPERATIONを使用して、EclipseLinkの演算子をコールします。

使用方法

EclipseLinkでは、様々なデータベースに変換される標準の演算子名を使用して、多くのデータベース関数がサポートされます。EclipseLinkの演算子は、同等の関数(関数のセット)を持つ任意のデータベースでサポートされます。EclipseLinkのExpressionOperatorクラスを使用して、カスタム演算子を定義したり、DatabasePlatformが演算子をオーバーライドできるようにします。

OPERATORFUNCTIONに似ていますが、関数をデータベースに依存しないようにすることができるため、特別な構文が必要な関数をコールできます。

サポートされるEclipseLinkの演算子は、次のとおりです。

  • Abs

  • ToUpperCase

  • ToLowerCase

  • Chr

  • Concat

  • Coalesce

  • Case

  • HexToRaw

  • Initcap

  • Instring

  • Soundex

  • LeftPad

  • LeftTrim

  • RightPad

  • RightTrim

  • Substring

  • Translate

  • Ascii

  • Length

  • CharIndex

  • Cast

  • Extract

  • CharLength

  • Difference

  • Reverse

  • Replicate

  • Right

  • Locate

  • ToNumber

  • ToChar

  • AddMonths

  • DateToString

  • MonthsBetween

  • NextDay

  • RoundDate

  • AddDate

  • DateName

  • DatePart

  • DateDifference

  • TruncateDate

  • NewTime

  • Nvl

  • NewTime

  • Ceil

  • Cos

  • Cosh

  • Acos

  • Asin

  • Atan

  • Exp

  • Sqrt

  • Floor

  • Ln

  • Log

  • Mod

  • Power

  • Round

  • Sign

  • Sin

  • Sinh

  • Tan

  • Tanh

  • Trunc

  • Greatest

  • Least

  • Add

  • Subtract

  • Divide

  • Multiply

  • Atan2

  • Cot

  • Deref

  • Ref

  • RefToHex

  • Value

  • ExtractXml

  • ExtractValue

  • ExistsNode

  • GetStringVal

  • GetNumberVal

  • IsFragment

  • SDO_WITHIN_DISTANCE

  • SDO_RELATE

  • SDO_FILTER

  • SDO_NN

  • NullIf

例3-10に、このJPQLの拡張機能を使用する方法を示します。

例3-10 OPERATOR EQLの使用

SELECT e FROM Employee e WHERE OPERATOR('ExtractXml', e.resume, '@years-experience') > 10

関連項目

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

REGEXP

REGEXPを使用して、文字列が正規表現に一致するかどうかを判断します。

使用方法

REGEXP関数を使用するには、データベースが正規表現をサポートしている必要があります。

例3-11に、このJPQLの拡張機能を使用する方法を示します。

例3-11 REGEXP EQLの使用

e.lastName REGEXP '^Dr\.*'

SQL

SQLを使用して、JPQL文内でSQLを統合します。問合せにJPQLでサポートされていない関数が必要な場合があるため、これはネイティブのSQL問合せを使用するかわりになります。

使用方法

SQL関数には、SQL文字列(JPQL文に埋め込む)およびSQL文字列に変換する引数の両方が含まれています。疑問符( ? )を使用して、SQL関数の引数から変換されるSQL内のパラメータを定義します。

SQLを使用して、標準ではない構文でデータベース関数をコールしたり、SQLリテラルを埋め込んだり、JPQL内でその他のSQL操作を実行することができます。SQLを使用すると、問合せに引き続きJPQLを使用できます。

例3-12に、このJPQLの拡張機能を使用する方法を示します。

例3-12 SQL EQの使用

SELECT p FROM Phone p WHERE SQL('CAST(? AS CHAR(3))', e.areaCode) = '613'
SELECT SQL('EXTRACT(YEAR FROM ?)', e.startDate) AS year, COUNT(e) FROM Employee e GROUP BY year
SELECT e FROM Employee e ORDER BY SQL('? NULLS FIRST', e.startDate)
 
SELECT e FROM Employee e WHERE e.startDate = SQL('(SELECT SYSDATE FROM DUAL)')

TABLE

TABLEを使用して、マップされていない表にアクセスします。

使用方法

TABLE関数では、JPQL問合せで結合表、コレクション表、履歴表、監査表またはシステム表を使用します。

例3-13に、SELECT文内で監査表(マップされていない)を使用する方法を示します。

例3-13 TABLE EQLの使用

SELECT e, a.LAST_UPDATE_USER FROM Employee e, TABLE('AUDIT') a WHERE a.TABLE = 'EMPLOYEE' AND a.ROWID = COLUMN('ROWID', e)

TREAT

TREATを使用して、サブクラス値としてオブジェクトをキャストします(つまり、継承がある関連エンティティをダウンキャストします)。

例3-14に、このJPQLの拡張機能を使用する方法を示します。

例3-14 TREAT EQLの使用

SELECT e FROM Employee JOIN TREAT(e.projects AS LargeProject) 
p WHERE p.budget > 1000000

UNION

UNIONを使用して、2つの問合せの結果を1つの問合せに結合します。

使用方法

UNIONを使用すると、両方の問合せからの一意の結果が戻されます。ALLオプションを含めると、両方の問合せで検出された結果が重複します。

例3-15に、このJPQLの拡張機能を使用する方法を示します。

例3-15 UNION EQLの使用

SELECT MAX(e.salary) FROM Employee e WHERE e.address.city = :city1
UNION SELECT MAX(e.salary) FROM Employee e WHERE e.address.city = :city2

関連項目

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