Как написать HQL-запрос для многих ко многим ассоциациям? - PullRequest
12 голосов
/ 28 сентября 2010

У меня есть 3 таблицы, Role[roleId, roleName], Token[tokenID, tokenName] & ROLETOKENASSOCIATION[roleId, tokenID].Третий был автоматически создан hibernate.Теперь, если я просто напишу Запрос, чтобы получить все объекты из средств класса Role, он выдаст все объекты роли вместе со связанным tokenID & tokenName.

Я просто хотел, чтобы ассоциация была однонаправленной.То есть: Roles ---> Tokens Итак, аннотация в классе Role выглядит следующим образом:

@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

Теперь я хочу tokenNames для определенного roleId.Сначала я сделал запрос, подобный этому SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId Но я закончил с некоторой ошибкой разыменования.

Затем я изменил запрос на SELECT tkns FROM Role r WHERE r.roleId=:roleId Теперь я получил то, что хотел.Но это идет и с roleId.

Как мне получить само имя токена?На самом деле моя проблема решена, но я хотел бы знать, как это сделать.

Мне будет полезно, если кто-нибудь объяснит конструкцию запроса.

Любойпредложения !!

Ответы [ 2 ]

15 голосов
/ 29 сентября 2010

Вы пробовали

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

РЕДАКТИРОВАТЬ: Этот запрос почти напрямую сопоставляется с соответствующим запросом SQL, где Role r JOIN r.tkns t является сокращенным синтаксисом для соединения SQL через таблицу ссылок Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId.Ответ Affe - другой синтаксис для того же запроса.

См. Также:

2 голосов
/ 29 сентября 2010

Вы хотите скалярный список только из поля имени?Вы должны быть в состоянии получить это так

select t.name from Roles r, IN(r.tkns) t where r.roleId = :id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...