2011-11-24 8 views
8

Tôi có một lớp với một một chiều với nhiều mối quan hệ như sau:Hibernate - HQL để lấy một bộ sưu tập từ mối quan hệ Unidirectional OneToMany

public class Order { 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="order_item", joinColumns={@JoinColumn(name="order_id")}, inverseJoinColumns={@JoinColumn(name="item_id")}) 
    public Set<Item> getItems() { 
     return items; 
    } 
} 

thường nhận được các nội dung của lệnh này là đơn giản:

List<Item> items = order.getItems(); 

Nhưng vì lý do nào đó tôi có thể muốn lọc kết quả theo cách nào đó và chỉ lấy một phần của một tập hợp các mặt hàng như tất cả các mặt hàng hơn một mức giá nhất định, dưới một số cổ phiếu nhất định. sau đó lọc sau đó). Để làm điều này tôi sẽ chạy một truy vấn HQL để lấy các mục cho một thứ tự cụ thể và thêm một số thứ khác vào mệnh đề where của tôi hoặc vào đối tượng truy vấn của tôi.

trực giác tôi muốn hành vi này (Đó là hoàn toàn sai):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order 

Nhưng tất nhiên điều này là sai như HQL làm việc trong điều kiện của đơn vị lập bản đồ, vì vậy tôi không thể sử dụng bảng tham gia truy vấn. Vì vậy, cách chính xác để làm điều này là gì?

Edit:

Tôi đã tìm thấy câu trả lời cho câu hỏi này, tôi muốn các truy vấn sau đây:

Select o.items from Order o where o = ? 

này cho phép tôi để lấy bộ sưu tập các mặt hàng cho một trật tự, mà không cần phải sử dụng mối quan hệ hai chiều. Tôi hiện nay tuy nhiên bối rối trên sân khấu thứ hai của câu hỏi này, đó là làm thế nào để lọc các kết quả của bộ sưu tập này, các ví dụ đơn giản nhất là:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc 

nào trả về nỗ lực bất hợp pháp vào bộ sưu tập dereference, vì vậy làm thế nào tôi sẽ lọc những đồ của tôi?

Edit:

Các giải pháp vé thực sự là đúng, tôi không nhận định các giải pháp ban đầu.

Trả lời

6
select item from Order order 
inner join order.items item 
where order = :order 
and ... 

Truy vấn HQL sử dụng thực thể và liên kết của họ. Thực tế là các hiệp hội sử dụng một bảng tham gia hay không là không quan trọng đối với HQL: bạn điều hướng thông qua các hiệp hội và Hibernate không dịch phù hợp với SQL.

+0

cảm ơn sự giúp đỡ của bạn, hãy xem chỉnh sửa của tôi – mogronalol

3

Có vẻ như bạn muốn ánh xạ phía bên kia của mối quan hệ này, tức là thực hiện ánh xạ hai hướng này.

Sau đó, bạn có thể sử dụng số đơn hàng trong HQL của bạn:

from Item as item where item.amount > :amount and item.order.id = :orderId 

Từ HQL documentation:

từ Cát như mèo nơi cat.mate.id = 69 Truy vấn là hiệu quả và không yêu cầu một bảng tham gia.

Thực tế là bạn đang cố thực hiện truy vấn này cho thấy mối quan hệ giữa một Dòng và Đơn hàng của nó là quan trọng!

+1

Không cần phải thực hiện liên kết hai chiều. Xem câu trả lời của tôi. –

+0

Bạn không cần. Điều đó không có nghĩa là bạn không nên. Các tài liệu Hibernate giải thích rằng HQL cho trường hợp này được tối ưu hóa cho tình huống mà bạn đã ánh xạ cả hai bên. –

+0

cảm ơn sự giúp đỡ của bạn, xem chỉnh sửa của tôi – mogronalol