-
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クエリです。 その結合の最も適切なテーブルへの条件。