-
Bedeutung von
select d from TKBData d JOIN d.columns c WHERE c.name = column1
ist- Suchen Sie ein TKBData-Objekt, bei dem es eine zugehörige
column
hat Objekt für dasname
istcolumn1
- Sobald entschieden ist, welche TKBData mindestens eine
column
hat Objekt für dasname
istcolumn1
, dann werden alle zugehörigencolumn
zurückgegeben Objekte über die Sie in JPA keine Kontrolle haben. (siehe Meine Antwort auf eine andere Frage ). Alternativ können Sie natives SQL schreiben und benutzerdefinierte Objekte zurückgeben, die keine Entitäten sind - Zum Beispiel haben Sie
TKBDATA_1
mitcolumn1
undcolumn2
zugeordnet, haben Sie auchTKBDATA_2
mitcolumn3
verbunden. - Wenn Sie Ihre Abfrage ausführen, wird
TKBDATA_2
ignoriert und beschließt,TKBDATA_1
zurückzugeben da es mindestens einecolumn
hat Objekt mitname
=column2
. Aber danach Sie haben keine Kontrolle darüber, welchecolumn
zugeordnet ist Objekte, die fürTKBDATA_1
zurückgegeben werden sollen und JPA gibt alle zugeordneten Spaltenobjekte zurück - Wenn Sie sich über den Grund nicht sicher sind, lesen Sie mehr über die Ruhezustandssitzung. Wie sie eine eindeutige Darstellung aller zugehörigen Einträge im Speicher bietet. Es ist die Grundlage für seine
dirty checking
undrepeatable read
- Suchen Sie ein TKBData-Objekt, bei dem es eine zugehörige
-
Aktualisieren Sie Ihr
@OneToMany
wie folgt
@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();
-
Wenn es um die JPA-Abfragesprache geht, würde ich gerne als Abfrage eine Sammlung von In-Memory-Objekten betrachten.
-
Versuchen Sie nun, die Bedeutung der folgenden beiden Abfragen in Bezug auf Objekte zu beschreiben.
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
-
Vergessen Sie nicht, anders als in SQL, wo Sie Spalten auswählen, hier Sie gesagt haben, dass Sie TKBData-Objekte auswählen und einschränken möchten, welche TKBData-Objekte zurückgegeben werden sollen.
-
Verwenden Sie also die zweite JPA-Abfrage
, um das gleiche Ergebnis wie mit Ihrer nativen SQL zu erzielen
Hinweis:
Obwohl Sie in Ihrer SQL-Abfrage einen linken Join verwendet haben, handelt es sich effektiv um eine SQL-Abfrage mit innerem Join, da Sie auch ein where
angewendet haben Bedingung an die Tabelle ganz rechts in diesem Join.