-
Значение на
select d from TKBData d JOIN d.columns c WHERE c.name = column1
е- Намерете TKBData обект, където има свързана
column
обект, за койтоname
еcolumn1
- След като реши кой TKBData има поне една
column
обект, за койтоname
еcolumn1
, тогава ще върне всички свързани с негоcolumn
предмети които нямате контрол в JPA. ( вижте Моят отговор на друг въпрос ). Алтернатива е да напишете естествен sql и да върнете персонализирани обекти, които не са обект - Например имате
TKBDATA_1
сcolumn1
иcolumn2
свързан, имате иTKBDATA_2
сcolumn3
свързани. - Когато изпълните заявката си, тя ще игнорира
TKBDATA_2
и решава да върнеTKBDATA_1
тъй като има поне еднаcolumn
обект сname
=column2
. Но след това нямате контрол върху това коя свързанаcolumn
обекти за връщане заTKBDATA_1
и JPA ще върне всички свързани колонни обекти - Ако не сте сигурни за причината, прочетете за сесията на хибернация. Как предоставя уникално представяне на всеки свързан запис в паметта. Това е основата за неговата
dirty checking
иrepeatable read
- Намерете TKBData обект, където има свързана
-
Актуализирайте своя
@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, бих искал да мисля по отношение на заявката за колекция от обекти в паметта.
-
Така че сега се опитайте да опишете значението на следните две заявки от гледна точка на обекти.
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, използвайте втората JPA заявка
Забележка:
Въпреки че сте използвали ляво присъединяване във вашата sql заявка, това на практика е вътрешна заявка за присъединяване, защото сте приложили и where
условие към най-дясната маса на това съединение.