-
Significato di
select d from TKBData d JOIN d.columns c WHERE c.name = column1è- Trova un oggetto TKBData a cui è associata una
columnoggetto per il qualenameècolumn1 - Una volta deciso quale TKBData ha almeno una
columnoggetto per il qualenameècolumn1, quindi restituirà tutte le suecolumnassociate 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_1concolumn1ecolumn2associato, hai ancheTKBDATA_2concolumn3associati. - Quando esegui la tua query, ignorerà
TKBDATA_2e decide di restituireTKBDATA_1poiché ha almeno unacolumnoggetto conname=column2. Ma dopo non hai il controllo su qualecolumnassociata oggetti da restituire perTKBDATA_1e 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 checkingerepeatable read
- Trova un oggetto TKBData a cui è associata una
-
Aggiorna il tuo
@OneToManycome 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.