2009-10-13 27 views
24

Có ai biết về tính hợp lệ của các phương thức Criteria.list()Query.list() của Hibernate trả về nhiều lần xuất hiện của cùng một thực thể không? Thỉnh thoảng tôi tìm thấy khi sử dụng API tiêu chí, việc thay đổi chiến lược tìm nạp mặc định trong định nghĩa ánh xạ lớp của tôi (từ "select" thành "join") đôi khi có thể ảnh hưởng đến bao nhiêu tham chiếu đến cùng một thực thể của list() và tôi không chắc liệu có nên coi đây là lỗi hay không. Javadoc không định nghĩa nó, nó chỉ đơn giản nói "Danh sách các kết quả truy vấn phù hợp". (cảm ơn các bạn).Có hợp lệ cho danh sách Hibernate() để trả về các bản sao không?

Nếu điều này được mong đợi và hành vi bình thường, thì tôi có thể tự xóa danh sách, nhưng đó không phải là vấn đề, nhưng nếu đó là lỗi, thì tôi muốn tránh nó hơn là xóa kết quả và thử để bỏ qua nó.

Bất kỳ ai có bất kỳ trải nghiệm nào về điều này?

Trả lời

20

Có, việc sao chép hoàn toàn có thể nếu bạn xây dựng các truy vấn của mình để điều này có thể xảy ra. Xem ví dụ Hibernate CollectionOfElements EAGER fetch duplicates elements

+6

+1. Làm thế nào tôi có thể không upvote ai đó liên kết đến câu trả lời của tôi? :-) Nghiêm túc, tuy nhiên - có, Hibernate có thể trả về các bản sao khi nhiều hơn một liên kết "nhiều" được khai báo với tìm nạp háo hức hoặc được truy xuất bằng cách sử dụng tìm nạp tham gia trong cùng một truy vấn. Xem ghi chú ở cuối 14.3: http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-joins – ChssPly76

+0

Cảm ơn liên kết doc, tôi biết rằng để được ở đó một nơi nào đó – skaffman

+0

@ ChssPly76 Liên kết bị hỏng! – Champ

4

Nếu bạn có một đối tượng có danh sách các đối tượng phụ trên đó và tiêu chí của bạn nối hai bảng với nhau, bạn có thể nhận được bản sao của đối tượng chính.

Một cách để đảm bảo rằng bạn không nhận được bản sao là sử dụng DistinctRootEntityResultTransformer. Nhược điểm chính của việc này là nếu bạn đang sử dụng tính toán bộ đệm/hàng kết quả. Cả hai không làm việc cùng nhau.

4

Tôi cũng bắt đầu nhận thấy hành vi này trong API Java của mình khi nó bắt đầu phát triển. Vui vì có một cách dễ dàng để ngăn chặn nó. Trong thực tế, tôi đã bắt đầu bổ sung:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

Để tất cả tiêu chí của tôi trả về danh sách. Ví dụ:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria() 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list(); 
Các vấn đề liên quan