Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.2.1.2.0) E82670-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関数へのアクセスを提供しています。
COLUMN
を使用して、オブジェクト表のマップされていない列にアクセスします。
使用方法
COLUMN
を使用して、外部キー列、継承識別子またはプリミティブ列(ROWID
など)にアクセスできます。@AdditionalCriteria
注釈内のJPQLフラグメントでCOLUMN
を使用することもできます。
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
を使用して両方の問合せで検出された結果のみを戻します。
例
例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
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
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)')
TREAT
を使用して、サブクラス値としてオブジェクトをキャストします(つまり、継承がある関連エンティティをダウンキャストします)。