-
Význam
select d from TKBData d JOIN d.columns c WHERE c.name = column1je- Najděte objekt TKBData tam, kde má přidružený
columnobjekt, pro kterýnamejecolumn1 - Jakmile se rozhodne, která data TKBD mají alespoň jeden
columnobjekt, pro kterýnamejecolumn1, pak vrátí všechny souvisejícícolumnobjekty 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_1scolumn1acolumn2přidružen, máte takéTKBDATA_2scolumn3související. - Když spustíte dotaz, bude ignorovat
TKBDATA_2a rozhodne se vrátitTKBDATA_1protože má alespoň jedencolumnobjekt sname=column2. Ale potom nemáte kontrolu nad tím, který přidruženýcolumnobjekty, které se mají vrátit proTKBDATA_1a 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 checkingarepeatable read
- Najděte objekt TKBData tam, kde má přidružený
-
Aktualizujte svůj
@OneToManyná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í.