Question

Mon mappage HibernateUserImpl ressemble à celui présenté ci-dessous

<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>

Je fais une requête HQL comme

select distinct hibuser from HibernateUserImpl hibuser, hibuser.groups.elements  hibgroup where hibuser.name = ? and hibgroup.name = ?

Je reçois une erreur pour hibuser.groups. éléments . Y a-t-il quelque chose qui me manque?

erreur dans la console

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 = ?]
Était-ce utile?

La solution

Je pense que vous devez créer une jointure explicite.

    select distinct hibuser 
    from HibernateUserImpl hibuser
    join hibuser.groups hibgroup 
    where hibuser.name = ? and hibgroup.name = ?

Autres conseils

hibuser.groups est une collection, vous ne pouvez donc pas accéder à l'attribut de l'élément de la collection.

Ceci peut être illustré comme suit:

Liste des groupes = ...; groups.elements < - accès illégal aux fonctions.

Ainsi, pour accéder à hibuser.groups.elements , vous devez effectuer plusieurs jointures:

select element 
from HibernateUserImpl hibuser 
join hibuser.groups group 
join group.elements element 
where hibuser.name = ? and hibgroup.name = ? and element.whatever = something

Mais ici, vous sélectionnez uniquement sur hibuser, vous ne devez donc pas rejoindre d'autres collections. Si vous ne vous inscrivez pas, vous obtiendrez tout d’abord une requête plus rapide et vous évitez d’utiliser distinct. Essayez d'éviter autant que possible distinct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top