2012-03-15 16 views
9

Sto utilizzando una query HQL per ottenere determinati record. Se utilizzo LEFT JOIN FETCH una raccolta che si trova nella mia entità target conterrà record duplicati. Se uso solo join sinistro, non lo farò. Immagino che quando Hibernate carica pigramente i record, evita i duplicati.Duplicati utilizzando il recupero join sinistro

"SELECT z FROM ", TableA.TABLE_NAME, " z ", // 
      "LEFT JOIN FETCH z.attributeX pv ", // 
      "LEFT JOIN FETCH pv.attributeY anteil ", // 
      "LEFT JOIN FETCH z.attributeB kma ", // 
      "LEFT JOIN FETCH kma.attributeC ", // 
      "WHERE anteil.attributeD.attributeE.id = :eId ", // 
      "AND pv.attributeG.id = :gId "); 

mio entità TableA ha un link al di TablePV (LEFT JOIN FETCH z.attributeX pv)

TablePV ha una collezione di Tabley ("LEFT JOIN FETCH pv.attributeY Anteil)

Ora Hibernate eseguirà il mapping di tutto correttamente, ad eccezione dei figli di TablePV, conterrà più volte lo stesso record.Un disinct sul TableA non aiuta, dal momento che non ci sono duplicati lì. Potrei rimuovere manualmente quei record che sarebbero piuttosto poco performanti

+0

Utilizzare un set come raccolta. –

+0

AFAIK LEFT JOIN FETCH e una restrizione su di esso è l'esclusiva reciproca in quanto la restrizione potrebbe filtrare gli elementi della raccolta per attirare l'attenzione. Forse hai una diversa causa principale qui – Firo

+0

Grazie per le tue risposte. Un set risolverà il problema ma è un work-around e creerà altri problemi (ad esempio l'ordine). Non so se è esclusivo mutuo, dal momento che il caso ha senso. Voglio che i record vengano recuperati nella stessa query e non con un'altra istruzione select. Questo accadrebbe se usassi LEFT JOIN solo senza FETCH. – Daniel

risposta

-1

Provare a utilizzare DISTINCT nella query, ad esempio SELECT DISTINCT z FROM Entity z...

+3

Come accennato nella mia domanda, questo non fa il trucco. Il problema è che la raccolta contiene duplicati, non l'entità principale stessa. – Daniel

Problemi correlati