2010-09-28 20 views
9

Tengo 3 tablas, Role[roleId, roleName], Token[tokenID, tokenName] & ROLETOKENASSOCIATION[roleId, tokenID]. El tercero fue creado automáticamente por Hibernate. Ahora bien, si simplemente escribo una consulta para obtener todos los objetos de la clase Rol, significa que todos los objetos de rol se asocian con el tokenID asociado & tokenName.¿Cómo se escribe una consulta HQL para muchas asociaciones?

Solo quería la asociación como unidireccional. es decir: Roles ---> Fichas Así que la anotación en la clase de papel se parece,

@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 

ahora quiero los tokenNames para el roleId específica. Primero hice una consulta como esta SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId Pero terminé con algún error de desreferencia.

Luego cambié la consulta a SELECT tkns FROM Role r WHERE r.roleId=:roleId Ahora tengo lo que quería. Pero viene con roleId también.

¿Cómo obtendré tokenName en sí? En realidad, mi problema está resuelto, pero me gustaría saber cómo hacerlo.

Me será útil, si alguien explica la Construcción de consultas.

Cualquier sugerencia!

Respuesta

10

Ha tratado

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

EDIT: Esta consulta los mapas de casi directamente a la consulta SQL correspondiente en el que Role r JOIN r.tkns t es una sintaxis abreviada para el SQL se unen a través de la tabla de enlaces Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId. La respuesta de Affe es otra sintaxis para la misma consulta.

Consulte también:

+0

En realidad, soy nuevo en hibernación y HQL. ¡Sería útil para mí si explicas la consulta! –

+0

@NooB: actualizado. – axtavt

1

¿Quiere una lista escalar solo del nombre del campo? Usted debe ser capaz de conseguir que al igual que este

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