2012-11-07 19 views
7

Tôi phải sửa đổi truy vấn Hibernate DetachedCriteria lớn để tìm nạp một số liên kết bổ sung.Eager tìm nạp đối tượng lồng nhau với DetachedCriteria trong Hibernate

đồ thị đối tượng của tôi giống như cấu trúc bên dưới, tôi muốn lấy bán hàng kết hợp với mỗi xe:

<class name="Showroom" table="showroom"> 
    ... 
    <bag name="cars" lazy="false"> 
     <one-to-many class="Car" /> 
    </bag> 
    ... 
</class> 

<class name="Car" table="car"> 
    ... 
    <set name="sales" lazy="true"> 
     <one-to-many class="Sale" /> 
    </set> 
    ... 
</class> 

Những gì tôi muốn làm là một cái gì đó như:

DetachedCriteria criteria = DetachedCriteria.forClass(Showroom.class); 
// ... Existing criteria query code ... 
criteria.setFetchMode("cars.sales", FetchMode.JOIN); 

Nhưng lập luận associationPath trong setFetchMode dường như bỏ qua ký hiệu chấm và tôi nhận được LazyInitializationException:

Gây ra bởi: org.hibe rnate.LazyInitializationException: thất bại trong việc uể oải khởi tạo một tập hợp các vai trò: Car.sales, không có phiên làm việc hoặc phiên đã được đóng

Tôi đã tìm kiếm xung quanh và cho đến nay không tìm thấy ví dụ hoặc các thông tin. Hibernate documentation không cung cấp các ví dụ về cách tìm nạp các liên kết lồng nhau và Javadoc for setFetchMode dường như gợi ý rằng cách tiếp cận dấu chấm của tôi phải có tác dụng ...

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

15
DetachedCriteria dc = DetachedCriteria.forClass(ShowRoom.class, "showRoom"); 
criteria.setFetchMode("showRoom.cars", FetchMode.JOIN); 
criteria.createAlias("showRoom.cars", "car", CriteriaSPecification.LEFT_JOIN); 
criteria.setFetchMode("car.sales", FetchMode.JOIN); 

Bạn không thể chuỗi thuộc tính trong truy vấn tiêu chí. Và ngay cả trong một truy vấn HQL, cars.sales không hợp lệ, vì cars đề cập đến một bộ sưu tập chứ không phải cho một phiên bản của Ô tô. Tham gia là cần thiết để có thể tham khảo một chiếc xe trong bộ sưu tập xe ô tô. Đó là những gì mà cuộc gọi createAlias() thực hiện. Ở trên cũng tương tự như

select showRoom from ShowRoom 
left join fetch showRoom.cars car 
left join fetch car.sales 
+0

Hoàn hảo, cảm ơn lời giải thích. Tôi đã không nhận ra rằng createAlias ​​có một mục đích kép là tạo ra các phép nối cũng như các bí danh của trường. – seanhodges

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