8.17.4 FROM節
ここではFROM節について説明します。
(1) 範囲変数宣言と識別変数
範囲変数宣言とは,FROM節内でエンティティクラスの論理的な名前を記述し,そのあとにASと識別子を指定する宣言です(ASは省略できます)。この範囲変数宣言の識別子を識別変数といいます。範囲変数宣言と識別変数の例を次に示します。
SELECT ・・・(省略)・・・ FROM Department AS dep WHERE ・・・(省略)・・・
「Department AS dep」の部分が範囲変数宣言です。また,「dep」が識別変数となります。次に,範囲変数宣言の構文を示します。
range_variable_declaration ::= abstract_schema_name [AS] identification_variable
範囲変数宣言での識別変数の構文は,SQLの構文と同じです。構文について説明します。
-
キーワードASの使用は任意です。
-
識別変数を省略することはできません。ただし,抽象スキーマと識別変数の間に指定するASは省略できます。識別変数はFROM節で指定します。
-
予約済みの識別子は使用できません。使用した場合は例外が発生します。
-
同じ永続化ユニットのほかのエンティティと同じ名前は使用できません。CJPAプロバイダでは,同じ名前のエンティティを使用した場合の動作は保証しません。
-
識別変数は大文字,小文字の区別をしません。
-
抽象スキーマ名と同一の名前は指定できません。CJPAプロバイダでは,同じ名前の抽象スキーマを指定した場合の動作は保証しません。
-
Java識別子文字で始まり,ほかのすべての文字はJava識別子の部分文字となる必要があります。それ以外の文字が指定された場合は,例外が発生します。最初の文字は,Character.isJavaIdentifierStartメソッドの戻り値がtrueになる文字にします(アンダースコア(_)とドルマーク($)文字を含む)。最初以外の文字は,Character.isJavaIdentifierPartメソッドの戻り値がtrueになる文字にします(ただし,クエスチョンマーク(?)は,JPQLの予約語のため使用できません)。
-
JPQLの予約語は次のとおりです。
SELECT,FROM,WHERE,UPDATE,DELETE,JOIN,OUTER,INNER,LEFT,GROUP,BY,HAVING,FETCH,DISTINCT,OBJECT,NULL,TRUE,FALSE,NOT,AND,OR,BETWEEN,LIKE,IN,AS,UNKNOWN,EMPTY,MEMBER,OF,IS,AVG,MAX,MIN,SUM,COUNT,ORDER,BY,ASC,DESC,MOD,UPPER,LOWER,TRIM,POSITION,CHARACTER_LENGTH,CHAR_LENGTH,BIT_LENGTH,CURRENT_TIME,CURRENT_DATE,CURRENT_TIMESTAMP,NEW,EXISTS,ALL,ANY,SOME
なお,「UNKNOWN」はJPA1.0では利用していませんが,CJPAプロバイダでは予約語となっているので注意してください。
(2) パス式
パス式は,識別変数のあとにピリオド(.)を付加し,ステートフィールドまたは関連フィールドを続けるための式です。このため,パス式の型は,ステートフィールドまたは関連フィールドの型になります。
パス式をたどって得た関連フィールドから,さらにパス式を組み立てることができます。ただし,基になるパス式の型がコレクション関連フィールドである場合,パス式を組み立てることはできません。コレクション型からパス式を作ることは,構成的に誤りとなります。
なお,パス式の途中の関連フィールドがnull値の場合,パスは値がないとみなされるので,クエリの結果には影響はありません。
パス式は,inner joinを使用する構文で使用できます。パス式の構文の詳細については,「付録G JPQLのBNF」を参照してください。
- 参考
-
関連フィールドの種類を次に示します。
-
コレクション関連フィールド(collection_valued_association_field)とは,関連フィールドがコレクションで指定されているものです。OneToManyまたはManyToManyの関係で示されます。
-
非コレクション関連フィールド(single_valued_association_field)とは,関連フィールドがsingle-valuedで指定されているものです。OneToOneまたはManyToOneの関係で示されます。
-
エンベッデドクラスフィールドは,embeddedクラスに対応するエンティティのフィールド名です。
-
(3) Joins式
Joins式はFROM節で使用できます。使用できるJoins式を次の表に示します。
Joins式 |
内容 |
BNF構文の構文名※1 |
---|---|---|
Inner Joins |
関係するフィールドで,二つのエンティティクラスを結合し,関連を持っているエンティティオブジェクトだけを抽出します。 |
join, join_spec |
Left Outer Joins |
関係するフィールドで,二つのエンティティクラスを結合し,関連を持っているエンティティオブジェクトおよび,関連を持っていないエンティティオブジェクトも抽出します。 |
join, join_spec |
Fetch Joins |
関係のあるフィールドで,二つエンティティクラスを結合します。なお,エンティティ間にはリレーションシップによる関連があるため,Select節中には一つのエンティティクラスだけを指定します。※2 |
fetch_join |
SELECT emp FROM Employee AS emp JOIN FETCH emp.company
- Join式を使用する場合の注意事項
-
Join式を使用する場合の注意事項について説明します。
- Inner Joinsの注意事項
-
INNERキーワードは,任意で使われます。
- Left Outer Joinsの注意事項
-
OUTERキーワードは,任意で使われます。
- Fetch Joinsの注意事項
-
-
Fetch Joinsでは,一つのエンティティで二つのエンティティ情報を指定します。指定するエンティティと,そのエンティティと関連する別のエンティティ情報を結合します。
なお,CJPAプロバイダの場合,一つのエンティティ情報で結合するため,リレーションシップを持つエンティティを指定してください。リレーションシップを持たないエンティティを指定した場合は例外が発生します。
-
JOIN FETCHの右側で参照される関係は,クエリの結果として返されるエンティティに属する関係となる必要があります。CJPAプロバイダの場合,エンティティに属さないときは例外が発生します。
-
JOIN FETCHの右側で参照されるエンティティには,識別子を指定できません。このため,クエリ内で参照することはできません。
-
(4) コレクションメンバの宣言
コレクションメンバ宣言の識別変数は,予約された識別子INを使って宣言します。コレクションメンバ式で定義された識別変数は,パス式を使ってコレクションの値を取得できます。コレクションメンバ式の記述例を次に示します。
SELECT emp.employeeId, emp.employeeName, dep.departmentName FROM Department AS dep, IN (dep.employees) AS emp WHERE dep.departmentId = 3
なお,コレクションメンバ式の構文の詳細については,「付録G JPQLのBNF」を参照してください。
(5) 注意事項
ここでは,FROM節での注意事項について説明します。
-
識別変数の影響
FROM節で宣言された識別変数がWHERE節の中で使用されなくても,宣言された識別変数がクエリの結果に反映されます。
-
多態性の注意事項
JPQLはポリフォリズムです。FROM節で明確に参照している特定のエンティティクラスのインスタンスだけでなく,そのサブクラスも対象になります。このため,クエリによって取得できるインスタンスは,クエリ条件を満たすサブクラスのインスタンスを含みます。