2012-03-15 12 views
9

Estoy usando una consulta HQL para obtener ciertos registros. Si utilizo LEFT JOIN FETCH, una colección que esté en mi entidad objetivo contendrá registros duplicados. Si solo uso left join, no lo hará. Supongo que cuando Hibernate carga los registros de forma perezosa, evita los duplicados.Duplicados usando búsqueda de unión izquierda

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

Mi entidad TableA tiene un enlace para que TablePV (LEFT JOIN FETCH pv z.attributeX)

TablePV tiene una colección de Tabley ("LEFT JOIN FETCH Anteil pv.attributeY)

Ahora Hibernate mapeará todo correctamente excepto los hijos de TablePV. Contendrá varias veces el mismo registro. Una desinencia en TableA no ayuda, ya que no hay duplicados allí. Podría eliminar manualmente esos registros que serían bastante inadecuados.

+0

Use un conjunto como su colección. –

+0

AFAIK IZQUIERDA UNIRSE A FETCH y una restricción es mutuamente exclusiva ya que la restricción puede filtrar los elementos de la colección para obtener ansias. Quizás tengas una causa raíz diferente aquí – Firo

+0

Gracias por tus respuestas. Un conjunto resolverá el problema, pero es una solución temporal y creará otros problemas (ordenar, por ejemplo). No sé si es exclusivo de la mutualidad, ya que el caso tiene sentido. Quiero que los registros se obtengan en la misma consulta y no con otra declaración de selección. Esto sucedería si solo usara LEFT JOIN sin FETCH. – Daniel

Respuesta

-1

Intente usar DISTINCT en su consulta, algo así como SELECT DISTINCT z FROM Entity z...

+3

Como mencioné en mi pregunta, esto no funciona. El problema es que la colección contiene duplicados, no la entidad principal en sí misma. – Daniel

Cuestiones relacionadas