2012-03-15 37 views
9

Tôi đang sử dụng truy vấn HQL để nhận các bản ghi nhất định. Nếu tôi sử dụng LEFT JOIN FETCH một bộ sưu tập mà là trong thực thể mục tiêu của tôi sẽ chứa bản ghi trùng lặp. Nếu tôi chỉ sử dụng trái tham gia, nó sẽ không. Tôi đoán khi Hibernate lười biếng tải các bản ghi, nó tránh trùng lặp.Các bản sao sử dụng tìm nạp tham gia bên trái

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

thực thể TableA của tôi có một liên kết đến để TablePV (LEFT JOIN FETCH z.attributeX pv)

TablePV có một bộ sưu tập của TableY ("LEFT JOIN FETCH pv.attributeY anteil)

Bây giờ Hibernate sẽ ánh xạ tất cả mọi thứ một cách chính xác ngoại trừ các con của TablePV, nó sẽ chứa nhiều lần cùng một bản ghi Một bản phân biệt trên TableA không giúp ích gì, vì không có bản sao ở đó. .

+0

Sử dụng Tập hợp làm bộ sưu tập của bạn. –

+0

AFAIK LEFT JOIN FETCH và một hạn chế về nó là độc quyền lẫn nhau vì hạn chế có thể lọc ra các yếu tố của bộ sưu tập để tìm nạp háo hức. Có thể bạn có một nguyên nhân gốc rễ khác ở đây – Firo

+0

Cảm ơn câu trả lời của bạn. Một Set sẽ giải quyết vấn đề nhưng là một công việc xung quanh và sẽ tạo ra các vấn đề khác (đặt hàng ví dụ). Tôi không biết liệu nó có độc quyền hay không, vì trường hợp này có ý nghĩa. Tôi muốn các bản ghi được tìm nạp trong cùng một truy vấn chứ không phải với một câu lệnh chọn khác. Điều này sẽ xảy ra nếu tôi chỉ sử dụng LEFT JOIN mà không có FETCH. – Daniel

Trả lời

-1

Thử sử dụng DISTINCT trong truy vấn của bạn, ví dụ như SELECT DISTINCT z FROM Entity z...

+3

Như đã đề cập trong câu hỏi của tôi, điều này không làm các trick. Vấn đề là, bộ sưu tập chứa các bản sao, chứ không phải bản thân chính. – Daniel

Các vấn đề liên quan