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 = ?]
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top