-
Bedeutung von
select d from TKBData d JOIN d.columns c WHERE c.name = column1ist- Suchen Sie ein TKBData-Objekt, bei dem es eine zugehörige
columnhat Objekt für dasnameistcolumn1 - Sobald entschieden ist, welche TKBData mindestens eine
columnhat Objekt für dasnameistcolumn1, dann werden alle zugehörigencolumnzurü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_1mitcolumn1undcolumn2zugeordnet, haben Sie auchTKBDATA_2mitcolumn3verbunden. - Wenn Sie Ihre Abfrage ausführen, wird
TKBDATA_2ignoriert und beschließt,TKBDATA_1zurückzugeben da es mindestens einecolumnhat Objekt mitname=column2. Aber danach Sie haben keine Kontrolle darüber, welchecolumnzugeordnet ist Objekte, die fürTKBDATA_1zurü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 checkingundrepeatable read
- Suchen Sie ein TKBData-Objekt, bei dem es eine zugehörige
-
Aktualisieren Sie Ihr
@OneToManywie 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.