error de elementos Hibernate HQL
Pregunta
Mi mapeo HibernateUserImpl se ve a continuación
<set name="groups" table="OS_USER_GROUP" inverse="false" cascade="none" lazy="false">
<key column="user_id"/>
<many-to-many column="group_id" class="com.opensymphony.user.provider.hibernate3.ahxu.impl.HibernateGroupImpl"/>
</set>
Hago consultas HQL como
select distinct hibuser from HibernateUserImpl hibuser, hibuser.groups.elements hibgroup where hibuser.name = ? and hibgroup.name = ?
Recibo un error para hibuser.groups. elementos . ¿Hay algo que me pierda?
error en la consola
org.hibernate.hql.ast.QuerySyntaxException: hibuser.groups.elements is not mappe
d [select distinct hibuser from com.opensymphony.user.provider.hibernate3.ahxu.i
mpl.HibernateUserImpl hibuser, hibuser.groups.elements hibgroup where hibuser.n
ame = ? and hibgroup.name = ?]
Solución
Creo que necesitas hacer una unión explícita .
select distinct hibuser
from HibernateUserImpl hibuser
join hibuser.groups hibgroup
where hibuser.name = ? and hibgroup.name = ?
Otros consejos
hibuser.groups es una colección, por lo que no puede acceder al atributo del elemento de la colección.
Esto se puede ilustrar como:
Lista de grupos = ...; groups.elements < - acceso ilegal a funciones.
Por lo tanto, para acceder a hibuser.groups.elements , debe hacer varias uniones:
select element
from HibernateUserImpl hibuser
join hibuser.groups group
join group.elements element
where hibuser.name = ? and hibgroup.name = ? and element.whatever = something
Pero aquí solo selecciona en hibuser, por lo que no debe unirse a otras colecciones. No unirse primero le dará una consulta más rápida y evitará el uso de distintivos. Trate de evitar distinciones tanto como sea posible.