2012-03-15 15 views
9

Belirli kayıtları almak için bir HQL sorgusu kullanıyorum. SOL JOIN FETCH'i kullanırsam hedef varlığımdaki bir koleksiyonda yinelenen kayıtlar bulunur. Sadece sol birleşim kullanırsam, olmaz. Hibernate tembelce kayıtları yükler zaman, çiftleri önler sanırım.Soldaki birleştirmeyi kullanarak çoğaltmaları getir

"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 "); 

Benim varlık TableA Şimdi TablePV için bir bağlantı (SOL z.attributeX pv FETCH JOIN)

TablePV Tabley bir koleksiyon ("SOL pv.attributeY anteil FETCH JOIN) sahiptir

sahiptir Hibernate, TablePV'nin çocukları hariç her şeyi doğru bir şekilde haritalandıracaktır. Birkaç kez aynı kayıt içerecektir. Orada hiçbir çift olmadığından TableA'nın bir kısmı yardımcı olmaz, sanırım oldukça yetersiz olan bu kayıtları elle kaldırabilirim.

+0

Koleksiyonunuzu Set olarak kullanın. –

+0

AFAIK SOL JOIN FETCH ve bununla ilgili bir kısıtlama, münferit olarak münhasırdır, çünkü kısıtlama, istekliyi almak için koleksiyonun unsurlarını filtreleyebilir. Belki başka bir kök nedeniniz var. – Firo

+0

Yanıtlarınız için teşekkürler. Bir Set sorunu çözecektir, ancak bir iştir ve başka problemler yaratacaktır (örneğin sipariş). Davaya özel olup olmadığını bilmiyorum, çünkü durum mantıklı. Kayıtların aynı sorguda alınmasını ve başka bir select ifadesiyle yapılmasını istiyorum. Bu sadece FETCH olmadan SOL JOIN kullansaydım olur. – Daniel

cevap

-1

Sorunuzun içinde DISTINCT kullanmayı deneyin, örneğin SELECT DISTINCT z FROM Entity z...

+3

Soruda belirtildiği gibi, bu hile yapmaz. Sorun, koleksiyonun ana varlığı değil, kopyaları içermesidir. – Daniel

İlgili konular