-
Значение на
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 условие към най-дясната маса на това съединение.