-
Význam
select d from TKBData d JOIN d.columns c WHERE c.name = column1
je- Najděte objekt TKBData tam, kde má přidružený
column
objekt, pro kterýname
jecolumn1
- Jakmile se rozhodne, která data TKBD mají alespoň jeden
column
objekt, pro kterýname
jecolumn1
, pak vrátí všechny souvisejícícolumn
objekty které v JPA nemáte pod kontrolou. (viz Moje odpověď na další otázku ). Alternativou je napsat nativní sql a vrátit vlastní neentitní objekty - Například máte
TKBDATA_1
scolumn1
acolumn2
přidružen, máte takéTKBDATA_2
scolumn3
související. - Když spustíte dotaz, bude ignorovat
TKBDATA_2
a rozhodne se vrátitTKBDATA_1
protože má alespoň jedencolumn
objekt sname
=column2
. Ale potom nemáte kontrolu nad tím, který přidruženýcolumn
objekty, které se mají vrátit proTKBDATA_1
a JPA vrátí všechny přidružené objekty sloupců - Pokud si nejste jisti důvodem, přečtěte si o relaci hibernace. Jak poskytuje jedinečnou prezentaci jakékoli související položky v paměti. Je to základ pro jeho
dirty checking
arepeatable read
- Najděte objekt TKBData tam, kde má přidružený
-
Aktualizujte svůj
@OneToMany
následovně
@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();
-
Pokud jde o dotazovací jazyk JPA, rád bych v pojmech dotazování myslel na kolekci objektů v paměti.
-
Pokuste se tedy nyní popsat význam následujících dvou dotazů z hlediska objektů.
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
-
Nezapomeňte, že na rozdíl od SQL, kde zde vybíráte libovolné sloupce, jste řekli, že chcete vybrat objekty TKBData a omezit, které objekty TKBData se mají vrátit.
-
Chcete-li tedy dosáhnout stejného výsledku jako u vašeho nativního SQL, použijte druhý dotaz JPA
Poznámka:
I když jste ve svém dotazu SQL použili levé spojení, je to ve skutečnosti dotaz vnitřního spojení SQL, protože jste také použili where
stavu k nejsprávnějšímu stolu na tomto spojení.