-
Betekenis van
select d from TKBData d JOIN d.columns c WHERE c.name = column1is- Zoek een TKBData-object met een bijbehorende
columnobject waarvoornameiscolumn1 - Zodra is besloten welke TKBData ten minste één
columnheeft object waarvoornameiscolumn1, dan retourneert het alle bijbehorendecolumnobjecten 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_1metcolumn1encolumn2gekoppeld, heb je ookTKBDATA_2metcolumn3gekoppeld. - Wanneer u uw zoekopdracht uitvoert, negeert deze
TKBDATA_2en besluitTKBDATA_1terug te sturen omdat het ten minste ééncolumn. heeft object metname=column2. Maar daarna je hebt geen controle over welke gekoppeldecolumnobjecten om te retourneren voorTKBDATA_1en 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 checkingenrepeatable read
- Zoek een TKBData-object met een bijbehorende
-
Update uw
@OneToManyals 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.