[JPA]オブジェクト向けクエリー言語2-中級構文
[1]パス式
:.
オブジェクト図面を参照select m.username
from Member m
join m.team t
join m.orders o
where t.name
m.username
→ステータスフィールドm.team
→単一値関連フィールドm.orders
→集合値関連フィールド
フィールドは3つあります
ステータスフィールド
:値を格納するフィールドのみ
Ex. m.username
関連フィールド(関連フィールド)
:関連関係を表すフィールド
1つの値フィールドを関連付けます.@ManyToOne
、OneToOne
、ターゲットがエンティティ(Ex.m.team)
関連コレクション値フィールド:@OneToMany
、@ManyToMany
、ターゲットは集合(Ex.m.orders)
特長
select m.username
from Member m
join m.team t
join m.orders o
where t.name
ステータスフィールド(State field):パスナビゲーションの終了.ナビゲーションX
m.usernameのように
.
を印刷し、二度と入る場所がない単一値の関連パス:暗黙的な内部結合が発生し、Oをナビゲートします.
気持ちよさそうですが、気をつけて使います.いいえ、
ただ、、書かないで、
集合値の関連パス:抑制された内部結合オカレンス、ナビゲーションX
-FROMセクションから別名を明示的に結合して取得する場合は、別名を使用してナビゲートできます.
明示的に署名する.
明示的な結合:joinキーを直接使用する
select m from Member m join m.team t
暗黙結合:経路式によって暗黙的にSQL結合を生成します(内部結合のみ)
select m.team from Member m
パスナビゲーションを使用するヒントチェックインの注意事項
最終的には実務にある.
[2]尋尋JPQL-ペッキョイン1(fetchjoin)-基本
プリフェッチ結合
エンティティペア
プリ結合使用コード
コレクションペア
コードの使用
DISTINCT
:重複データが気に入らない場合はDISTINTで削除
-DISTINTをSQLに追加
-エンティティ重複除外
📌 1対複数の署名をすると、データが誇張される可能性があります.しかし、これとは逆に多対一の関係は誇張されない.
select distinct t
from Team t join fetch t.members
where t.name = '팀A'
DISTINTをSQLに追加しましたが、データが異なるため、重複除外はSQL結果で失敗しました
DISTINCTは、他のアプリケーションから重複除外を試みます
同じ識別子を持つTeamエンティティの削除
ペッキーコネクタと普通のコネクタの違い
一般署名
一般結合の実行時に関連付けられたエンティティを同時にクエリーしない
JPQLは、結果を返すときに関連関係を考慮せずにselectセクションで指定したエンティティのみをクエリーします.
ここではチームエンティティのみがクエリーされ、メンバーエンティティはクエリーされません.
ペアリング結合を使用している場合にのみ、関連するエンティティが同時に検索されます(すぐにロードされます).
(実際には、即時ロードと考えられます.遅延ロードは指定されていますが、プリロードを使用するとプリロードよりも優先されるため、すぐにロードされます.)
プリフェッチ結合は、SQLクエリーオブジェクトのグラフィックの概念です.
プリカップリング
[3]プリフェッチ結合2-限界
原則として、パッチオブジェクトに別名を付けることはできません.(ex. ... as m where m.username)
ネイビーに染められるなるべく使わないでください.
2つ以上のコレクションはパッチワークできません.
集合を一緒に貼り合わせると、ページングAPI(
setFirstResult
、setMaxResult
)は使用できません.1対1、複数対1などの単一値関連フィールドに対して、ページング結合を行うことができます.
Hypernetはアラートログを残し、メモリにページングします(非常に危険です)
SQLによる関連エンティティの問合せ→パフォーマンスの最適化
エンティティに直接適用されるグローバル・ロード・ポリシーよりも優先
(グローバル・ロード・ポリシー:
@OneToMany(fetch = FetchType.LAZY
)すべてのグローバル・ロード・ポリシーは、実際の操作では遅延ロードです.
最適化が必要な場所でプリフェッチ結合を適用
つまり。
すべてのことはパッチワークで解決できない.オブジェクトシェイプを維持するときにプリフェッチ結合を使用するのは有効です.
エンティティが持つ形状ではなく複数のテーブルを結合する必要がある場合は、ペッキー結合ではなく通常の結合を使用して、必要なデータのみを問合せ、DTOに戻るのが有効です.
[4]多形クエリ
あまり重要な内容ではありません
[5]エンティティを直接使用
[6]Namedクエリ-静的クエリ
:あらかじめ定義して命名したJPQL
@Entity
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
public class Member {
[7]一括演算
在庫がn個未満のすべての商品の価格をmパーセント引き上げる場合
JPA変更検出機能を使用して実行するには、SQLが多すぎます.
バッチ演算は、1回のクエリで複数のテーブルを変更できます.
注意事項
まず
JPAは難しすぎて、遅かれ早かれまた聞きますが、
Reference
この問題について([JPA]オブジェクト向けクエリー言語2-中級構文), 我々は、より多くの情報をここで見つけました https://velog.io/@dbsrud11/JPA-객체지향-쿼리-언어2-중급-문법テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol