-
Betydelse av
select d from TKBData d JOIN d.columns c WHERE c.name = column1
är- Hitta ett TKBData-objekt där det har en associerad
column
objekt för vilketname
ärcolumn1
- När det har bestämts vilken TKBData som har minst en
column
objekt för vilketname
ärcolumn1
, så returnerar den alla dess associeradecolumn
föremål som du inte har kontroll över i JPA. ( se Mitt svar på en annan fråga ). Alternativet är att skriva inbyggd sql och returnera anpassade icke-entitetsobjekt - Du har till exempel
TKBDATA_1
medcolumn1
ochcolumn2
associerad har du ocksåTKBDATA_2
medcolumn3
associerade. - När du kör din fråga ignorerar den
TKBDATA_2
och bestämmer sig för att returneraTKBDATA_1
eftersom den har minst encolumn
objekt medname
=column2
. Men efter det du har inte kontroll över vilken associeradcolumn
objekt att returnera förTKBDATA_1
och JPA returnerar alla associerade kolumnobjekt - Om du inte är säker på orsaken, läs om vilolägessession. Hur det ger en unik presentation av alla tillhörande poster i minnet. Det är grunden för dess
dirty checking
ochrepeatable read
- Hitta ett TKBData-objekt där det har en associerad
-
Uppdatera din
@OneToMany
enligt följande
@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();
-
När det kommer till JPA-frågespråk, skulle jag vilja tänka i termer av fråga en samling av objekt i minnet.
-
Så försök nu att beskriva innebörden av följande två frågor i termer av 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
-
Glöm inte till skillnad från i sql där du är markera några kolumner här har du sagt att du vill välja TKBData-objekt och begränsa vilka TKBData-objekt som ska returneras.
-
Så för att uppnå samma resultat som för din inbyggda sql, använd den andra JPA-frågan
Obs!
Även om du använde en vänster-join i din SQL-fråga, är det faktiskt en inre join-sql-fråga eftersom du också har använt en where
skick till den mest rätta tabellen på den sammanfogningen.