2011-06-19 27 views
7

Tình huống như sau:HQL: nỗ lực bất hợp pháp để thu thập tiền gửi

Tôi có một thực thể Sách có mối quan hệ một-nhiều với Chương.

Bây giờ nếu tôi thử truy vấn "from Book book inner join book.chapters chapter where chapter.title like '%hibernate%'", nó mang lại cho tôi kết quả mong muốn.

Nhưng nếu tôi thử, "from Book where book.chapters.title like '%hibernate%'", tôi nhận được lỗi nỗ lực bất hợp pháp để thu thập thu thập dữ liệu.

Điều này là tôi chỉ muốn thu lại các đối tượng Book và không phải là một tập hợp các đối tượng Book và Chapter mà tôi nhận được với truy vấn cũ.

Ai đó có thể giúp tôi hiểu không?

Trả lời

12

chương là một bộ sưu tập trong sách và do đó sẽ không giữ tiêu đề sản phẩm (Collection.title). Bạn cần tham gia các chương để đưa chúng vào truy vấn của bạn như ví dụ đầu tiên của bạn. Nếu các chương của bạn được lập bản đồ một cách lười biếng, bạn sẽ chỉ nhận được một bộ sưu tập Sách mà không có các chương được tải trong chúng. Vì vậy, tôi sẽ nói, sử dụng truy vấn đầu tiên của bạn.

Để đọc thêm, hãy xem các trang query HQL joinsperformance fetching.

+1

Thậm chí nếu Chương thực thể được ánh xạ một cách lười biếng, tại sao nó sẽ chỉ nhận được những bộ sưu tập sách với truy vấn trước đây của tôi? Tôi nghĩ rằng 'chọn cuốn sách từ cuốn sách bên trong cuốn sách tham gia chương chương mà chapter.title như '% hibernate%'' là những gì tôi nên cố gắng thay vì ở nơi đầu tiên. Cảm ơn bạn đã trả lời :) – skip

+0

Tôi đã thêm hai liên kết vào câu trả lời của tôi nêu rõ các chiến lược tìm nạp. – joostschouten

+0

Cảm ơn các liên kết, nhưng tôi đã nhận được các cặp sách và chương trong kết quả ngay cả khi tôi đã sử dụng LAZY cho chiến lược tìm nạp. Tôi đã nhận được các đối tượng cuốn sách trùng lặp mặc dù. Cảm ơn các liên kết mặc dù :) – skip

2

Bạn có thể thực hiện việc này với truy vấn phụ.

Something như

from Book book where not exists (from chapter where 
        chapter.title like '%hibernate%' and chapter.book = book) 

(Không kiểm tra ...)

+1

Vâng, đó có thể là tốt. Vì một lý do nào đó, tôi nghĩ bạn có thứ gì đó mang lại cho bạn nhiều dữ liệu hơn bạn muốn. –

+1

'chọn cuốn sách từ sách cuốn sách bên trong tham gia book.ch chapter chương nơi chapter.title như '% hibernate%'' là làm việc tốt cho tôi. Cảm ơn bạn đã trả lời :) – skip

+0

Xin lỗi vì lỗi đánh máy trong bình luận cuối cùng của tôi, nó được cho là tiêu đề và ngủ đông. Có, tôi chỉ cần các đối tượng trùng lặp cần xóa và tôi muốn sử dụng một cái gì đó như LinkedHashSet trên bộ sưu tập sách được truy xuất từ ​​truy vấn. Cảm ơn :) – skip

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