2010-09-28 9 views
9

Mam 3 tabele, Role[roleId, roleName], Token[tokenID, tokenName] & ROLETOKENASSOCIATION[roleId, tokenID]. Trzecia została stworzona automatycznie przez hibernację. Teraz, jeśli po prostu napiszę zapytanie, aby uzyskać wszystkie obiekty z klasy Role, oznacza to, że wszystkie obiekty roli są przypisane wraz z powiązanym tokenem & tokenName.Jak napisać kwerendę HQL dla wielu do wielu stowarzyszeń?

Po prostu chciałem, aby asocjacja była jednokierunkowa. tj: Role ---> Żetony Więc adnotacji w klasie Rola wygląda,

@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 

Teraz chcę tokenNames dla konkretnego RoleId. Najpierw wysłałem zapytanie takie jak to SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId Ale skończyłem z pewnym błędem dereferencji.

Następnie zmieniłem zapytanie na SELECT tkns FROM Role r WHERE r.roleId=:roleId Teraz mam to, co chciałem. Ale przychodzi również z rolą.

Jak mogę dostać tokenName się? W rzeczywistości mój problem został rozwiązany, ale chciałbym wiedzieć, jak to zrobić.

To będzie pomocne dla mnie, jeśli ktoś wyjaśni Budowę zapytania.

Wszelkie sugestie !!

Odpowiedz

10

Czy próbowałeś

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

EDIT: To zapytanie mapy niemal bezpośrednio do odpowiedniego zapytania SQL gdzie Role r JOIN r.tkns t jest skróconym składni SQL przyłączyć za pośrednictwem tabeli linków Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId. Odpowiedź Affe jest kolejną składnią tego samego zapytania.

Zobacz także:

+0

Właściwie jestem nowy i HQL hibernacji. Byłoby mi pomocne, gdybyś wyjaśnił zapytanie! –

+0

@NooB: Zaktualizowano. – axtavt

1

Potrzebujesz skalarnej listy tylko pola nazwy? Powinieneś być w stanie dostać się, że podobnie jak to

select t.name from Roles r, IN(r.tkns) t where r.roleId = :id