-
Znaczenie
select d from TKBData d JOIN d.columns c WHERE c.name = column1
jest- Znajdź obiekt TKBData, z którym jest powiązana
column
obiekt, dla któregoname
tocolumn1
- Po ustaleniu, który TKBData ma przynajmniej jedną
column
obiekt, dla któregoname
tocolumn1
, zwróci wszystkie powiązanecolumn
obiekty nad którymi nie masz kontroli w JPA. ( patrz Moja odpowiedź na inne pytanie ). Alternatywą jest napisanie natywnego sql i zwrócenie niestandardowych obiektów niebędących obiektami - Na przykład masz
TKBDATA_1
zcolumn1
icolumn2
powiązane, masz równieżTKBDATA_2
zcolumn3
powiązane. - Gdy uruchomisz zapytanie, zignoruje ono
TKBDATA_2
i postanawia zwrócićTKBDATA_1
ponieważ ma co najmniej jednącolumn
obiekt zname
=column2
. Ale potem nie masz kontroli nad powiązanącolumn
obiekty do zwrócenia dlaTKBDATA_1
a JPA zwróci wszystkie powiązane obiekty kolumn - Jeśli nie jesteś pewien przyczyny, przeczytaj o sesji hibernacji.Jak zapewnia unikalną prezentację każdego powiązanego wpisu w pamięci. Jest to podstawa jego
dirty checking
irepeatable read
- Znajdź obiekt TKBData, z którym jest powiązana
-
Zaktualizuj swój
@OneToMany
w następujący sposób
@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();
-
Jeśli chodzi o język zapytań JPA, chciałbym myśleć w kategoriach zapytań o kolekcję obiektów w pamięci.
-
Spróbuj teraz opisać znaczenie poniższych dwóch zapytań w kategoriach obiektów.
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
-
Nie zapomnij, inaczej niż w sql, gdzie wybierasz tutaj dowolne kolumny, o których powiedziałeś, że chcesz wybrać obiekty TKBData i ograniczyć, które obiekty TKBData mają być zwracane.
-
Aby osiągnąć ten sam wynik, co w natywnym sql, użyj drugiego zapytania JPA
Uwaga:
Nawet jeśli użyłeś lewego sprzężenia w zapytaniu sql, jest to faktycznie wewnętrzne zapytanie sql, ponieważ zastosowałeś również where
warunek do najbardziej prawego stołu na tym połączeniu.