2014-11-27 14 views
7

Tôi bắt đầu sử dụng tính năng biểu đồ thực thể mới trong JPA 2.1 để chỉ định các bộ sưu tập Lười biếng phải được tải. Hãy xem xét các lớp học sau:JPA 2.1 Biểu đồ thực thể trả về kết quả trùng lặp

@Entity 
@NamedQueries({ 
    @NamedQuery(name="findWithFilterAttr","select a from A a where a.filterAttribute like :filter") 
}) 
@NamedEntityGraphs({ 
@NamedEntityGraph(name = "graph.childs", attributeNodes = @NamedAttributeNode("childs"))}) 
public class A{ 
    @Id 
    private long id; 
    @OneToMany(mappedBy="parent") 
    private List<B> childs; 
    private String filterAttribute; 
} 
@Entity 
public class B{ 
    @Id 
    private long id; 
    @ManyToOne 
    private A parent; 
} 

Khi tôi thực hiện truy vấn tên để có được một danh sách của A tổ chức với sự gợi ý tổ chức graph tôi nhận được một bộ sưu tập với lặp đi lặp lại một thực thể. Làm cách nào tôi chỉ có thể tải các thực thể A một lần.

Tôi đang sử dụng:

  • Hibernate 4.3.5
  • Wildfly 8,1

Trả lời

5

cuối cùng tôi giải quyết này, tôi đã thêm DISTINCT với truy vấn đặt tên và mọi thứ hoạt động bây giờ .... Lỗi này xảy ra do khi Nhà cung cấp JPA tìm thấy gợi ý biểu đồ thực thể, nó tạo ra một LEFT JOIN với bảng con. gốc Query mà không thực thể đồ thị:

11:55:28,950 INFO [stdout] (default task-23) Hibernate: 
11:55:28,950 INFO [stdout] (default task-23)  select 
11:55:28,951 INFO [stdout] (default task-23)   entitya0_.id as id1_0_0_, 
11:55:28,951 INFO [stdout] (default task-23)   childs1_.id as id1_1_1_, 
11:55:28,951 INFO [stdout] (default task-23)   entitya0_.filter as filter2_0_0_, 
11:55:28,951 INFO [stdout] (default task-23)   childs1_.parent_id as parent_i2_1_1_, 
11:55:28,951 INFO [stdout] (default task-23)   childs1_.parent_id as parent_i2_0_0__, 
11:55:28,951 INFO [stdout] (default task-23)   childs1_.id as id1_1_0__ 
11:55:28,951 INFO [stdout] (default task-23)  from 
11:55:28,951 INFO [stdout] (default task-23)   EntityA entitya0_ 
11:55:28,951 INFO [stdout] (default task-23)  left outer join 
11:55:28,952 INFO [stdout] (default task-23)   EntityB childs1_ 
11:55:28,952 INFO [stdout] (default task-23)    on entitya0_.id=childs1_.parent_id 
11:55:28,952 INFO [stdout] (default task-23)  where 
11:55:28,952 INFO [stdout] (default task-23)   entitya0_.filter like ? 

Query với biệt và tổ chức biểu đồ:

11:57:25,051 INFO [stdout] (default task-24) Hibernate: 
11:57:25,052 INFO [stdout] (default task-24)  select 
11:57:25,052 INFO [stdout] (default task-24)   distinct entitya0_.id as id1_0_0_, 
11:57:25,052 INFO [stdout] (default task-24)   childs1_.id as id1_1_1_, 
11:57:25,052 INFO [stdout] (default task-24)   entitya0_.filter as filter2_0_0_, 
11:57:25,052 INFO [stdout] (default task-24)   childs1_.parent_id as parent_i2_1_1_, 
11:57:25,052 INFO [stdout] (default task-24)   childs1_.parent_id as parent_i2_0_0__, 
11:57:25,052 INFO [stdout] (default task-24)   childs1_.id as id1_1_0__ 
11:57:25,052 INFO [stdout] (default task-24)  from 
11:57:25,052 INFO [stdout] (default task-24)   EntityA entitya0_ 
11:57:25,052 INFO [stdout] (default task-24)  left outer join 
11:57:25,052 INFO [stdout] (default task-24)   EntityB childs1_ 
11:57:25,052 INFO [stdout] (default task-24)    on entitya0_.id=childs1_.parent_id 
11:57:25,052 INFO [stdout] (default task-24)  where 
11:57:25,052 INFO [stdout] (default task-24)   entitya0_.filter like ? 
+0

Cảm ơn bạn rất nhiều vì đăng giải pháp của bạn! Điều này cũng làm việc với JPA có tên Truy vấn. xem: [bài đăng SO này] (http://stackoverflow.com/questions/24314829/named-entity-graph-joins-results-need-distinct-option) – muri

0

Một bổ sung nhỏ.

Tôi gặp vấn đề tương tự như bạn. Tôi nghĩ rằng hành vi này là bất ngờ và có thể là một lỗ hổng trong ngủ đông. Không cần thiết phải chỉ định distinct vì đó là trường hợp tìm nạp trực tiếp được chỉ định trong truy vấn JPQL.

Giải pháp của bạn là một giải pháp thay thế do hạn chế của việc triển khai. Bằng cách kiểm tra mã (tính toán của needsDistincting cờ trong phương pháp list(), có sẵn tại grepcode), có 2 giải pháp:

  • thêm giới hạn với truy vấn
  • sử dụng riêng biệt
+0

Lưu ý: đây là vấn đề ngủ đông thuần túy, không có Wildfly ở đây . Bạn nên xóa thẻ. – Jidehem

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