-
Betydning af
select d from TKBData d JOIN d.columns c WHERE c.name = column1
er- Find et TKBData-objekt, hvor det har en tilknyttet
column
objekt for hvilketname
ercolumn1
- Når det er besluttet, hvilken TKBData der har mindst én
column
objekt for hvilketname
ercolumn1
, så returnerer den hele dens tilknyttedecolumn
genstande som du ikke har kontrol over i JPA. ( se Mit svar på et andet spørgsmål ). Alternativet er at skrive native sql og returnere tilpassede ikke-entitetsobjekter - Du har f.eks.
TKBDATA_1
medcolumn1
ogcolumn2
tilknyttet, har du ogsåTKBDATA_2
medcolumn3
tilknyttet. - Når du kører din forespørgsel, ignorerer den
TKBDATA_2
og beslutter sig for at returnereTKBDATA_1
da den har mindst éncolumn
objekt medname
=column2
. Men efter det du har ikke kontrol over, hvilken tilknyttetcolumn
objekter, der skal returneres forTKBDATA_1
og JPA returnerer alle tilknyttede kolonneobjekter - Hvis du ikke er sikker på årsagen, så læs om dvale-session. Hvordan det giver en unik præsentation af enhver tilknyttet post i hukommelsen. Det er grundlaget for dens
dirty checking
ogrepeatable read
- Find et TKBData-objekt, hvor det har en tilknyttet
-
Opdater din
@OneToMany
som følger
@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 til JPA-forespørgselssprog, vil jeg gerne tænke på en samling af objekter i hukommelsen i form af forespørgsler.
-
Så prøv nu at beskrive betydningen af de følgende to forespørgsler i form af objekter.
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
-
Glem ikke, i modsætning til i sql, hvor du skal vælge en hvilken som helst kolonne her, du har sagt, at du vil vælge TKBData-objekter og begrænse, hvilke TKBData-objekter, der skal returneres.
-
Så for at opnå det samme resultat som for din oprindelige sql, brug den anden JPA-forespørgsel
Bemærk:
Selvom du brugte en venstre join i din sql-forespørgsel, er det faktisk en indre join-sql-forespørgsel, fordi du også har anvendt en where
tilstand til den mest rigtige tabel på den join.