Mysql
 sql >> Database >  >> RDS >> Mysql

problemi con OneToMany inclusa una clausola di filtro in jpa primaverile

  • Significato di select d from TKBData d JOIN d.columns c WHERE c.name = column1 è

    1. Trova un oggetto TKBData a cui è associata una column oggetto per il quale name è column1
    2. Una volta deciso quale TKBData ha almeno una column oggetto per il quale name è column1 , quindi restituirà tutte le sue column 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
    3. Ad esempio, hai TKBDATA_1 con column1 e column2 associato, hai anche TKBDATA_2 con column3 associati.
    4. Quando esegui la tua query, ignorerà TKBDATA_2 e decide di restituire TKBDATA_1 poiché ha almeno una column oggetto con name =column2 . Ma dopo non hai il controllo su quale column associata oggetti da restituire per TKBDATA_1 e JPA restituirà tutti gli oggetti colonna associati
    5. 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 e repeatable read
  • 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.