2009-07-22 40 views
10

tôi có các đối tượng miền Hibernate trông như thế này:HQL và một-nhiều truy vấn

class Player { 
     List<Item> inventory; 
    } 

    class Item { 
     List<Enchantment> enchantments; 
    } 

    class Enchantment { 
     boolean isSuperiorEnchantment; 
    } 

tôi cần phải xây dựng một truy vấn HQL trả về cho tôi một danh sách tất cả người chơi có ít nhất một mục với một mê hoặc trên nó có bộ cờ isSuperiorEnchantment. Tôi không thể cho cuộc sống của tôi tìm ra một cách để thể hiện điều này trong HQL.

Bất kỳ ý tưởng nào?

Trả lời

17

Giả sử các ánh xạ thích hợp trên tất cả những điều trên, các truy vấn mà bạn đang tìm kiếm là:

select p 
from Player as p 
    left join p.inventory as i 
    left join i.enchantments as e 
where e.isSuperiorEnchantment = 1 
+0

Thanks, điều này làm việc rất lớn. Tôi phải nhớ thêm "p chọn" vào mặt trước của nó, nhưng nếu không thì đó chính xác là những gì tôi cần! –

+0

Tôi chỉ học HQL, nhưng trong SQL thường xuyên này sẽ không làm việc - việc tham gia trái sẽ có nghĩa là bạn sẽ nhận được kết quả cầu thủ ngay cả khi không có hồ sơ phù hợp trong hàng tồn kho và Enchantments. (Tôi sẽ tiếp tục đào để làm rõ về điều này ... Tôi có một nghi ngờ "trái tham gia" có nghĩa là một cái gì đó khác nhau trong HQL, hoặc truy vấn này sẽ không được sử dụng nhiều). –

+1

@RobWhelan Truy vấn trên sẽ hoạt động (với các điều chỉnh thích hợp cho cú pháp, tất nhiên) tốt trong SQL thông thường do điều kiện 'e.isSuperiorEnchantment = 1' sẽ không thỏa mãn cho người chơi không có Enchantments vì' isSuperiorEnchantment' sẽ được trả về vô giá trị. – ChssPly76

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