-
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
columnobjekt för vilketnameärcolumn1 - När det har bestämts vilken TKBData som har minst en
columnobjekt för vilketnameärcolumn1, så returnerar den alla dess associeradecolumnfö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_1medcolumn1ochcolumn2associerad har du ocksåTKBDATA_2medcolumn3associerade. - När du kör din fråga ignorerar den
TKBDATA_2och bestämmer sig för att returneraTKBDATA_1eftersom den har minst encolumnobjekt medname=column2. Men efter det du har inte kontroll över vilken associeradcolumnobjekt att returnera förTKBDATA_1och 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 checkingochrepeatable read
- Hitta ett TKBData-objekt där det har en associerad
-
Uppdatera din
@OneToManyenligt 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.