-
Betekenis van
select d from TKBData d JOIN d.columns c WHERE c.name = column1
is- Zoek een TKBData-object met een bijbehorende
column
object waarvoorname
iscolumn1
- Zodra is besloten welke TKBData ten minste één
column
heeft object waarvoorname
iscolumn1
, dan retourneert het alle bijbehorendecolumn
objecten waar je geen controle over hebt in JPA. ( zie Mijn antwoord op een andere vraag ). Alternatief is om native sql te schrijven en aangepaste niet-entiteitsobjecten te retourneren - Je hebt bijvoorbeeld
TKBDATA_1
metcolumn1
encolumn2
gekoppeld, heb je ookTKBDATA_2
metcolumn3
gekoppeld. - Wanneer u uw zoekopdracht uitvoert, negeert deze
TKBDATA_2
en besluitTKBDATA_1
terug te sturen omdat het ten minste ééncolumn
. heeft object metname
=column2
. Maar daarna je hebt geen controle over welke gekoppeldecolumn
objecten om te retourneren voorTKBDATA_1
en JPA retourneert alle gekoppelde kolomobjecten - Als je niet zeker bent van de reden, lees dan over de slaapstand. Hoe het een unieke presentatie geeft van alle bijbehorende items in het geheugen. Het is de basis voor zijn
dirty checking
enrepeatable read
- Zoek een TKBData-object met een bijbehorende
-
Update uw
@OneToMany
als volgt
@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();
-
Als het gaat om JPA-querytaal, zou ik willen denken in termen van het opvragen van een verzameling in-memory-objecten.
-
Probeer nu dus de betekenis van de volgende twee zoekopdrachten in termen van objecten te beschrijven.
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
-
Vergeet niet dat in tegenstelling tot sql waar je kolommen selecteert die je hebt gezegd dat je TKBData-objecten wilt selecteren en dat je beperkt welke TKBData-objecten moeten worden geretourneerd.
-
Dus om hetzelfde resultaat te bereiken als van uw native sql, gebruikt u de tweede JPA-query
Opmerking:
Ook al heb je een left join gebruikt in je sql-query, het is in feite een inner join sql-query omdat je ook een where
hebt toegepast voorwaarde naar de meest rechtse tafel op die join.