Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.1.3) E57544-01 |
|
前 |
次 |
この章では、標準のJPA Java永続性問合せ言語(JPQL)に対するEclipseLinkの拡張機能について説明します。EclipseLink問合せ言語(EQL)と呼ばれるこれらの拡張機能は、その多くが標準SQLの一部である追加データベース機能へのアクセス、ネイティブなデータベース機能や関数へのアクセス、およびEclipseLink固有機能へのアクセスを提供します。
この章の内容は次のとおりです。
JQPLの詳細は、次を参照してください。
JPA仕様の問合せ言語に関する項(http://jcp.org/en/jsr/detail?id=317
)
Java EE 6チュートリアルのJava永続性問合せ言語に関する項(http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html
)
EclipseLinkは、次のEclipseLink EQL関数へのアクセスを提供しています。
CAST
を使用して、値を特定のデータベース・タイプに変換します。
使用方法
CAST
関数は、データベースに依存しませんが、データベースのサポートを必要とします。
例
例3-1に、このJPQLの拡張機能を使用する方法を示します。
COLUMN
を使用して、オブジェクト表のマップされていない列にアクセスします。
使用方法
COLUMN
を使用して、外部キー列、継承識別子またはプリミティブ列(ROWID
など)にアクセスできます。@AdditionalCriteria
注釈内のJPQLフラグメントでCOLUMN
を使用することもできます。
例
例3-2に、COLUMN
EQLを使用する方法を示します。
例3-3では、COLUMN
EQLを使用してプリミティブ列(ROWID
)にアクセスします。
関連項目
詳細は、次を参照してください。
複数の問合せを実行する際に、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
関数は、データベースに依存しませんが、データベースのサポートを必要とします。
例
例3-5に、このJPQLの拡張機能を使用する方法を示します。
FUNCTION
(以前のFUNC
)を使用して、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
を使用して両方の問合せで検出された結果のみを戻します。
例
例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
句を使用して、外部結合のためなどに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
関連項目
詳細は、次を参照してください。
OPERATION
を使用して、EclipseLinkの演算子をコールします。
使用方法
EclipseLinkでは、様々なデータベースに変換される標準の演算子名を使用して、多くのデータベース関数がサポートされます。EclipseLinkの演算子は、同等の関数(関数のセット)を持つ任意のデータベースでサポートされます。EclipseLinkのExpressionOperator
クラスを使用して、カスタム演算子を定義したり、DatabasePlatform
が演算子をオーバーライドできるようにします。
OPERATOR
はFUNCTION
に似ていますが、関数をデータベースに依存しないようにすることができるため、特別な構文が必要な関数をコールできます。
サポートされる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
関数を使用するには、データベースが正規表現をサポートしている必要があります。
例
例3-11に、このJPQLの拡張機能を使用する方法を示します。
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
関数では、JPQL問合せで結合表、コレクション表、履歴表、監査表またはシステム表を使用します。
例
例3-13に、SELECT
文内で監査表(マップされていない)を使用する方法を示します。
TREAT
を使用して、サブクラス値としてオブジェクトをキャストします(つまり、継承がある関連エンティティをダウンキャストします)。
例
例3-14に、このJPQLの拡張機能を使用する方法を示します。
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
関連項目
詳細は、次を参照してください。