-
Significato di
select d from TKBData d JOIN d.columns c WHERE c.name = column1
è- Trova un oggetto TKBData a cui è associata una
column
oggetto per il qualename
ècolumn1
- Una volta deciso quale TKBData ha almeno una
column
oggetto per il qualename
ècolumn1
, quindi restituirà tutte le suecolumn
associate oggetti su cui non hai il controllo in JPA. ( vedi La mia risposta a un'altra domanda ). L'alternativa è scrivere sql nativo e restituire oggetti non entità personalizzati - Ad esempio, hai
TKBDATA_1
concolumn1
ecolumn2
associato, hai ancheTKBDATA_2
concolumn3
associati. - Quando esegui la tua query, ignorerà
TKBDATA_2
e decide di restituireTKBDATA_1
poiché ha almeno unacolumn
oggetto conname
=column2
. Ma dopo non hai il controllo su qualecolumn
associata oggetti da restituire perTKBDATA_1
e JPA restituirà tutti gli oggetti colonna associati - Se non sei sicuro del motivo, leggi la sessione di ibernazione. Come fornisce una presentazione univoca di qualsiasi voce associata nella memoria. È la base per il suo
dirty checking
erepeatable read
- Trova un oggetto TKBData a cui è associata una
-
Aggiorna il tuo
@OneToMany
come segue
@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();
-
Quando si tratta del linguaggio di query JPA, vorrei pensare in termini di query a una raccolta di oggetti in memoria.
-
Quindi ora prova a descrivere il significato delle seguenti due query in termini di oggetti.
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
-
Non dimenticare, a differenza di sql, dove selezioni tutte le colonne qui che hai detto di voler selezionare oggetti TKBData e limitare quali oggetti TKBData restituire.
-
Quindi, per ottenere lo stesso risultato del tuo sql nativo, usa la seconda query JPA
Nota:
Anche se hai usato un join sinistro nella tua query sql, è effettivamente una query sql di inner join perché hai anche applicato un where
condizione alla tabella più a destra su quel join.