2010-09-28 36 views
9

Tôi có 3 bảng, Role[roleId, roleName], Token[tokenID, tokenName] & ROLETOKENASSOCIATION[roleId, tokenID]. Người thứ ba được tạo ra tự động bởi ngủ đông. Bây giờ nếu tôi chỉ đơn giản là viết một truy vấn để có được tất cả các đối tượng từ lớp vai trò có nghĩa là, nó cung cấp cho tất cả các đối tượng vai trò cùng với tokenID đính kèm & tokenName.Cách viết truy vấn HQL cho nhiều liên kết?

Tôi chỉ muốn liên kết như một chiều. tức là: Vai trò ---> Tokens Vì vậy, các chú thích trong lớp Vai trò có vẻ như,

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int roleId; 
private String roleName; 

@ManyToMany 
@JoinTable(name="ROLE_TOKEN_ASSOCIATION", 
joinColumns={@JoinColumn(name="roleId")}, 
inverseJoinColumns={@JoinColumn(name="tokenID")}) 
private List<Token> tkns; 
    //Getters & Setters 

Bây giờ tôi muốn tokenNames cho Id vai trò cụ thể. Đầu tiên tôi thực hiện một truy vấn như thế này SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId Nhưng, tôi đã kết thúc với một số lỗi dereference.

Sau đó, tôi đã thay đổi truy vấn thành SELECT tkns FROM Role r WHERE r.roleId=:roleId Bây giờ tôi đã có những gì tôi muốn. Nhưng nó cũng đi kèm với roleId.

Làm cách nào để tôi nhận được tokenName? Thực ra vấn đề của tôi đã được giải quyết, nhưng tôi muốn biết cách thực hiện.

Nó sẽ hữu ích cho tôi, nếu có ai đó giải thích về Xây dựng truy vấn.

Bất kỳ đề xuất nào !!

Trả lời

10

Các bạn đã thử

SELECT t.tokenName FROM Role r JOIN r.tkns t WHERE r.roleId = :roleId 

EDIT: Truy vấn này bản đồ gần như trực tiếp đến các truy vấn SQL tương ứng nơi Role r JOIN r.tkns t là một cú pháp tốc ký cho SQL tham gia thông qua bảng liên kết Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId. Câu trả lời của Affe là một cú pháp khác cho cùng một truy vấn.

Xem thêm:

+0

Trên thực tế, tôi mới để ngủ đông & HQL. Nó sẽ hữu ích cho tôi nếu bạn giải thích các truy vấn !!! –

+0

@NooB: Đã cập nhật. – axtavt

1

Bạn muốn danh sách vô hướng chỉ là trường tên? Bạn sẽ có thể nhận được rằng như thế này

select t.name from Roles r, IN(r.tkns) t where r.roleId = :id 
Các vấn đề liên quan