GlassFish勉強会で金魚本に載ってないJPQLの話をしてきた #GlassFishJP
ちなみに金魚本というのは以下の本です。
Beginning Java EE 6~GlassFish 3で始めるエンタープライズJava (Programmer's SELECTION)
- 作者: Antonio Goncalves,日本オラクル株式会社,株式会社プロシステムエルオーシー
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/09
- メディア: 大型本
- 購入: 5人 クリック: 147回
- この商品を含むブログ (29件) を見る
スライドは公開しましたが、勉強会にて口頭で補ったことが多かったので補足します。
JPQLとは
JPQLとはJPAで使われるクエリ記述言語です。
Entity および Entity 間のリレーションに対して問い合わせを行う事ができます。
SQLを直接記載しないため、データベースごとのSQL方言等を意識する必要がありません。*1
そのため、可搬性に優れたアプリケーションを作成することが出来ます。
JPQLでは主に複数のエンティティに対して同一の操作を行う時に使います。
JPQLではSELECT/UPDATE/DELETEの処理が行うことができ、予約後に関しては大文字小文字は区別しません。
ここから先に関しては、金魚本を読んでいることを前提としています。
しかしながら、SQLの知識が十分にあれば読んでいなくても理解することは出来るでしょう。
なお、すべてJPA2.0の内容です。
金魚本に載っていないけど 使えるJPQLの構文
JPQLでサポートされている構文のうち金魚本に載っていないものについて解説します。
副問い合わせ
副問い合わせが使用出来ることまでは金魚本に記載してあるのですが、副問い合わせの前にALL,ANY,SOMEのキーワードをつけれることに関しては記載されていません。
それぞれのキーワードの意味は以下のとおりです。
- ALL -> 副問い合わせすべてに合致する
- ANY -> 副問い合わせの結果の一つ以上に合致する
- SOME -> 副問い合わせの結果の一つ以上に合致する
SOMEとANYは同じ意味です。
副問い合わせ(EXISTS句)
副問い合わせの結果に含まれていることを表します。
このスライドの例ではNOTを付けない場合はspouseもemployeeに含まれるemployeeの一覧を返します。
相関副問い合わせ
相関副問い合わせを行うこともできます。
結合
SQLと違うのは、SQLではJOINの後にUSINGもしくはONを使用して結合するカラムを指定していましたが、JPQLではエンティティの関連を利用してJOINを行うことです。
JPQLでは左外部結合もしくは内部結合のみがサポートされます。
JPQL使用上の注意点
JPQL使用上の注意点として2点あげました。
すでにメモリ上に取得されたエンティティに対してはJPQLの操作は行われない
JPQLはメモリ上のオブジェクトに対しては影響を及ぼしません。
JPQLが実行される時は即座にSQLに変換されデータベースに対して反映が行われると考えたほうが良いです。
この例だと最後のJPQLが実行されたあとはデータベースとメモリ上のエンティティの状態は乖離していることになります。
JPQLとエンティティへの値の操作を併用する場合は実行順序に気をつけてください。
今回の内容について
基本的に全てJSRに記載されている内容です。
今回説明していないものに関しても色々と記載されているので、目を通す価値はあると思います。
日本語の資料では、少し古い(JPA1.0の内容)ですが、マスタリングJavaEE5の記載内容が一番詳しいので、そちらを参照するのが良いでしょう。
マスタリングJavaEE5 第2版 (DVD付) (Programmer’s SELECTION)
- 作者: 三菱UFJインフォメーションテクノロジー株式会社斉藤賢哉
- 出版社/メーカー: 翔泳社
- 発売日: 2009/11/28
- メディア: 大型本
- 購入: 5人 クリック: 29回
- この商品を含むブログ (11件) を見る