-
Betydning af
select d from TKBData d JOIN d.columns c WHERE c.name = column1er- Find et TKBData-objekt, hvor det har en tilknyttet
columnobjekt for hvilketnameercolumn1 - Når det er besluttet, hvilken TKBData der har mindst én
columnobjekt for hvilketnameercolumn1, så returnerer den hele dens tilknyttedecolumngenstande 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_1medcolumn1ogcolumn2tilknyttet, har du ogsåTKBDATA_2medcolumn3tilknyttet. - Når du kører din forespørgsel, ignorerer den
TKBDATA_2og beslutter sig for at returnereTKBDATA_1da den har mindst éncolumnobjekt medname=column2. Men efter det du har ikke kontrol over, hvilken tilknyttetcolumnobjekter, der skal returneres forTKBDATA_1og 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 checkingogrepeatable read
- Find et TKBData-objekt, hvor det har en tilknyttet
-
Opdater din
@OneToManysom 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.