3 Java永続性問合せ言語の拡張機能
この章の内容は次のとおりです。
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ユーザー・ガイド』
(
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL
)
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の使用
SELECT e FROM Employee e WHERE COLUMN('MANAGER_ID', e) = :id
例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 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 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
条件に他の条件を追加します。
使用方法
Oracle TopLinkでは、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
を使用して、Oracle TopLinkの演算子をコールします。
使用方法
Oracle TopLinkでは、異なるデータベースに変換される、標準演算子名を使用した多くのデータベース関数がサポートされています。Oracle TopLinkの演算子は、同等の関数(または関数セット)を持つデータベースでサポートされます。EclipseLinkのExpressionOperator
クラスを使用して、カスタム演算子を定義したり、DatabasePlatform
が演算子をオーバーライドできるようにします。
OPERATOR
はFUNCTION
に似ていますが、関数をデータベースに依存しないようにすることができるため、特別な構文が必要な関数をコールできます。
サポートされるOracle TopLinkの演算子は、次のとおりです。
-
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
-
値
-
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
関連項目
詳細は、次を参照してください。