JPA 2.1とJava EE 7でのJPQL強化機能(第1部-JOIN ON)
2096 ワード
Java EE 7は、エンティティ図やストレージ・プロシージャおよび結果マッピングのより良いサポートなど、非常に有用で期待されていた機能を提供して数年にわたって存在しています.概要については、Thorben Janssenのブログ記事を参照してください.ただし、JPAクエリー言語の機能について、より詳細な要約を追加したいと思います.これらは、JPQLおよびCriteria APIで使用できます. ONキーワードJOIN指定条件 FUNCTION任意のデータベース関数 を呼び出す処理は、エンティティをその特定のタイプ に下方修正する.
本稿では、最初の新規コンテンツについて重点的に紹介します.次の記事に他の2つを追加します.
に参加
JPAのJOIN式は、標準SQLのJOINとは異なります.JOINは、エンティティ間のマッピングがすでに存在する場合にのみ使用でき、暗黙的結合を使用する関連セットの遅延ロードのため、必ずしも必要ではない.JPA初心者の方は、注意深くJPA JOINを使用し、ドキュメントをお読みください.
JPA 2.1までは、WHERE句の条件を使用して最終クエリ結果をフィルタするしかありません.ほとんどの場合、これで十分です.ただし、LEFTJOINを使用すると、別のエンティティから結合するオブジェクトを制限する限界があります.LEFTJOINを使用すると、常に最初のエンティティから少なくとも1行を取得しますが、別のエンティティからのインスタンスをマージしたくない場合があり、最終セットを空にします.
HibernateでWITHキーワードを使用する以外に、JPAではこれまで標準的な方法はありませんでした.JPA 2.1よりONキーを使用して接続に条件を追加できます.SQL JOIN ONと似ています.
JPAでJOIN ONを使用した例
上のコードセグメントは、その人と同じ都市を持つアドレスのみを取得します.WHEREに条件を移動することで、同じ目的を達成することができます.その利点を見るには、複数の結合を有するより複雑な例が必要です.
JPAでJOIN ONを使用した例
上記の例では、所在国のみを取得し、住所と住所が存在し、その人員が同じ都市を持っている.WHEREを使うのはどんな違いがありますか?最後にON句の2つの条件をWHEREに入れると、同じ都市と同じアドレスだけでなく、1人のすべてのアドレスに関連するすべての国が含まれます.最後に条件を適用した場合にのみ、結果が大きくなる可能性があることは明らかです.ONキーを使用すると、結合のたびに結果をフィルタリングし、連続結合のたびに小さな結果を得ることができます.
ただし、JOINをONとともに使用する場合でも、エンティティは関連するエンティティにマッピングされた場合にのみ結合できるという制限があります.
Eclipselinkに複数のルートで追加
Eclipselinkは、標準JPA Onキーワードに追加機能を提供しています.ON条件で関連しないエンティティを関連付けることができ、関連しないエンティティをクエリーにすでに存在する他のエンティティに追加できます.したがって、単一のレポートの結合条件だけが必要であっても、マッピングを更新する必要はなく、フィールドを関連付けてマークする必要もありません.同様に、マッピングからデータベース・テーブルと制約を生成するテストも、何らかの理由で(たとえば、多くのテスト・データに制約違反がある可能性がある場合)、このテストを使用したくない場合があります.
これはEclipselinkでONを拡張して使用した例です(JPA 2.1規格には含まれていません).この人は都市と同じ名前の人に参加しました.
複数のルートエンティティを追加
翻訳:https://www.javacodegeeks.com/2016/02/jpql-enhancements-jpa-2-1-java-ee-7-part-1-join.html
本稿では、最初の新規コンテンツについて重点的に紹介します.次の記事に他の2つを追加します.
に参加
JPAのJOIN式は、標準SQLのJOINとは異なります.JOINは、エンティティ間のマッピングがすでに存在する場合にのみ使用でき、暗黙的結合を使用する関連セットの遅延ロードのため、必ずしも必要ではない.JPA初心者の方は、注意深くJPA JOINを使用し、ドキュメントをお読みください.
JPA 2.1までは、WHERE句の条件を使用して最終クエリ結果をフィルタするしかありません.ほとんどの場合、これで十分です.ただし、LEFTJOINを使用すると、別のエンティティから結合するオブジェクトを制限する限界があります.LEFTJOINを使用すると、常に最初のエンティティから少なくとも1行を取得しますが、別のエンティティからのインスタンスをマージしたくない場合があり、最終セットを空にします.
HibernateでWITHキーワードを使用する以外に、JPAではこれまで標準的な方法はありませんでした.JPA 2.1よりONキーを使用して接続に条件を追加できます.SQL JOIN ONと似ています.
JPAでJOIN ONを使用した例
SELECT a FROM Person p LEFT JOIN p.addresses a ON a.city = p.city
上のコードセグメントは、その人と同じ都市を持つアドレスのみを取得します.WHEREに条件を移動することで、同じ目的を達成することができます.その利点を見るには、複数の結合を有するより複雑な例が必要です.
JPAでJOIN ONを使用した例
SELECT c FROM Person p LEFT JOIN p.addresses a ON a.city = p.city LEFT JOIN a.country c ON c.region = 'Europe'
上記の例では、所在国のみを取得し、住所と住所が存在し、その人員が同じ都市を持っている.WHEREを使うのはどんな違いがありますか?最後にON句の2つの条件をWHEREに入れると、同じ都市と同じアドレスだけでなく、1人のすべてのアドレスに関連するすべての国が含まれます.最後に条件を適用した場合にのみ、結果が大きくなる可能性があることは明らかです.ONキーを使用すると、結合のたびに結果をフィルタリングし、連続結合のたびに小さな結果を得ることができます.
ただし、JOINをONとともに使用する場合でも、エンティティは関連するエンティティにマッピングされた場合にのみ結合できるという制限があります.
Eclipselinkに複数のルートで追加
Eclipselinkは、標準JPA Onキーワードに追加機能を提供しています.ON条件で関連しないエンティティを関連付けることができ、関連しないエンティティをクエリーにすでに存在する他のエンティティに追加できます.したがって、単一のレポートの結合条件だけが必要であっても、マッピングを更新する必要はなく、フィールドを関連付けてマークする必要もありません.同様に、マッピングからデータベース・テーブルと制約を生成するテストも、何らかの理由で(たとえば、多くのテスト・データに制約違反がある可能性がある場合)、このテストを使用したくない場合があります.
これはEclipselinkでONを拡張して使用した例です(JPA 2.1規格には含まれていません).この人は都市と同じ名前の人に参加しました.
複数のルートエンティティを追加
SELECT p FROM Person p LEFT JOIN Person p2 ON p2.city = p.city
翻訳:https://www.javacodegeeks.com/2016/02/jpql-enhancements-jpa-2-1-java-ee-7-part-1-join.html