Cosminexus アプリケーションサーバ V8 機能解説 基本・開発編(コンテナ共通機能)

[目次][用語][索引][前へ][次へ]

6.17.4 FROM節

ここではFROM節について説明します。

<この項の構成>
(1) 範囲変数宣言と識別変数
(2) パス式
(3) Joins式
(4) コレクションメンバの宣言
(5) 注意事項

(1) 範囲変数宣言と識別変数

範囲変数宣言とは,FROM節内でエンティティクラスの論理的な名前を記述し,そのあとにASと識別子を指定する宣言です(ASは省略できます)。この範囲変数宣言の識別子を識別変数といいます。範囲変数宣言と識別変数の例を次に示します。

SELECT ・・・(省略)・・・
 
FROM  Department AS dep
 
WHERE ・・・(省略)・・・
 

「Department AS dep」の部分が範囲変数宣言です。また,「dep」が識別変数となります。次に,範囲変数宣言の構文を示します。

range_variable_declaration ::= 
abstract_schema_name [AS] identification_variable
 

範囲変数宣言での識別変数の構文は,SQLの構文と同じです。構文について説明します。

(2) パス式

パス式は,識別変数のあとにピリオド(.)を付加し,ステートフィールドまたは関連フィールドを続けるための式です。このため,パス式の型は,ステートフィールドまたは関連フィールドの型になります。

パス式をたどって得た関連フィールドから,さらにパス式を組み立てることができます。ただし,基になるパス式の型がコレクション関連フィールドである場合,パス式を組み立てることはできません。コレクション型からパス式を作ることは,構成的に誤りとなります。

なお,パス式の途中の関連フィールドがnull値の場合,パスは値がないとみなされるので,クエリの結果には影響はありません。

パス式は,inner joinを使用する構文で使用できます。パス式の構文の詳細については,「付録D JPQLのBNF」を参照してください。

参考
関連フィールドの種類を次に示します。
  • コレクション関連フィールド(collection_valued_association_field)とは,関連フィールドがコレクションで指定されているものです。OneToManyまたはManyToManyの関係で示されます。
  • 非コレクション関連フィールド(single_valued_association_field)とは,関連フィールドがsingle-valuedで指定されているものです。OneToOneまたはManyToOneの関係で示されます。
  • エンベッデドクラスフィールドは,embeddedクラスに対応するエンティティのフィールド名です。

(3) Joins式

Joins式はFROM節で使用できます。使用できるJoins式を次の表に示します。

表6-20 FROM節で使用できるJoins式

Joins式 内容 BNF構文の構文名※1
Inner Joins 関係するフィールドで,二つのエンティティクラスを結合し,関連を持っているエンティティオブジェクトだけを抽出します。 join, join_spec
Left Outer Joins 関係するフィールドで,二つのエンティティクラスを結合し,関連を持っているエンティティオブジェクトおよび,関連を持っていないエンティティオブジェクトも抽出します。 join, join_spec
Fetch Joins 関係のあるフィールドで,二つエンティティクラスを結合します。なお,エンティティ間にはリレーションシップによる関連があるため,Select節中には一つのエンティティクラスだけを指定します。※2 fetch_join

注※1 BNF構文の構文名の詳細については,「付録D JPQLのBNF」を参照してください。

注※2 Fetch Joinsでエンティティを取得した場合,右側で指定した関連先のエンティティの情報をクエリ実行と同時に取得します。これによって,フェッチ戦略に依存しないで関連先の情報を取得できます。Fetch Joinsの記述例を次に示します。


SELECT emp FROM Employee AS emp JOIN FETCH emp.company
 

Join式を使用する場合の注意事項
Join式を使用する場合の注意事項について説明します。
Inner Joinsの注意事項
INNERキーワードは,任意で使われます。
Left Outer Joinsの注意事項
OUTERキーワードは,任意で使われます。
Fetch Joinsの注意事項
  • Fetch Joinsでは,一つのエンティティで二つのエンティティ情報を指定します。指定するエンティティと,そのエンティティと関連する別のエンティティ情報を結合します。
    なお,Cosminexus JPAプロバイダの場合,一つのエンティティ情報で結合するため,リレーションシップを持つエンティティを指定してください。リレーションシップを持たないエンティティを指定した場合は例外が発生します。
  • JOIN FETCHの右側で参照される関係は,クエリの結果として返されるエンティティに属する関係となる必要があります。Cosminexus JPAプロバイダの場合,エンティティに属さないときは例外が発生します。
  • JOIN FETCHの右側で参照されるエンティティには,識別子を指定できません。このため,クエリ内で参照することはできません。

(4) コレクションメンバの宣言

コレクションメンバ宣言の識別変数は,予約された識別子INを使って宣言します。コレクションメンバ式で定義された識別変数は,パス式を使ってコレクションの値を取得できます。コレクションメンバ式の記述例を次に示します。

SELECT emp.employeeId, emp.employeeName, dep.departmentName 
FROM Department AS dep, IN (dep.employees) AS emp 
WHERE dep.departmentId = 3 
 

なお,コレクションメンバ式の構文の詳細については,「付録D JPQLのBNF」を参照してください。

(5) 注意事項

ここでは,FROM節での注意事項について説明します。