-
select d from TKBData d JOIN d.columns c WHERE c.name = column1の意味columnが関連付けられているTKBDataオブジェクトを検索しますnameの対象オブジェクトcolumn1です- どのTKBDataに少なくとも1つの
columnがあるかが決まったらnameの対象オブジェクトcolumn1です 、次に、関連するすべてのcolumnを返します オブジェクト これはJPAでは制御できません。 (別の質問に対する私の答え )。別の方法は、ネイティブSQLを記述し、カスタムの非エンティティオブジェクトを返すことです - たとえば、
TKBDATA_1がありますcolumn1を使用 およびcolumn2関連して、TKBDATA_2もありますcolumn3を使用 関連付けられています。 - クエリを実行すると、
TKBDATA_2は無視されます そして、TKBDATA_1を返すことにしました。 少なくとも1つのcolumnがあるためnameのオブジェクト =column2。 しかしその後 関連するcolumnを制御することはできませんTKBDATA_1に返すオブジェクト JPAは関連するすべての列オブジェクトを返します - 理由がわからない場合は、Hibernateセッションについて読んでください。メモリ内の関連するエントリの一意のプレゼンテーションを提供する方法。これは、
dirty checkingの基盤です。 およびrepeatable read
-
@OneToManyを更新します 次のように
@OneToMany(fetch = FetchType.EAGER,
cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
@JoinTable(name = "TKBDATA_TKBCOLUMN",
joinColumns = @JoinColumn(name = "TKBDATA_ID"),
inverseJoinColumns = @JoinColumn(name = "COLUMNS_ID"))
private Set<TKBColumn> columns = Sets.newHashSet();
-
JPAクエリ言語に関しては、メモリ内のオブジェクトのコレクションをクエリするという観点から考えたいと思います。
-
それでは、次の2つのクエリの意味をオブジェクトの観点から説明してみてください。
select d from TKBData d LEFT JOIN d.columns c WHERE c.name = :name
vs
select d from TKBData d JOIN d.columns c WHERE c.name = :name
-
ここで任意の列を選択するSQLとは異なり、TKBDataオブジェクトを選択し、返すTKBDataオブジェクトを制限することを忘れないでください。
-
したがって、ネイティブSQLと同じ結果を得るには、2番目のJPAクエリを使用します
注:
SQLクエリで左結合を使用した場合でも、whereも適用したため、これは事実上内部結合SQLクエリです。 その結合の最も適切なテーブルへの条件。