2009-03-11 12 views
1

J'ai deux entités hibernate Utilisateur et Blog. L'utilisateur peut être intéressé par plusieurs tags. Le blog peut appartenir à plusieurs tags. Pour un utilisateur, comment puis-je trouver les blogs qui appartiennent aux tags qui intéressent l'utilisateur?Comment obtenir l'adhésion de deux associations One to Many?

je besoin de quelque chose comme

Select * from Blog where Blog.Tags IN User.Tags 

sauf que SQL ou HQL doesnt permettre de telles comparaisons dans la clause IN

Une solution qui est actuellement en utilisant im: 1. Générer une vue USER_BLOGS qui est cartésiennes produit des tables de jointure USER_TAGS et BLOG_TAGS. 2. Définir une entité UserBlog pour la vue et l'utiliser pour filtrer les blogs dans la requête HQL:

Select * from Blog where Blog.id IN (Select blog_id from UserBlog where user_id = "CurrentUser") 

Im sûr que ce soit un scénario commun. Existe-t-il une solution Hibernate ou HQL pure pour cela?

+0

Comment sont les relations entre le blog et les balises et l'utilisateur et les balises stockées? – slashmais

+0

dans deux tables jointes BLOG_TAGS et USER_TAGS avec TAGS sur une table distincte. – Sathish

Répondre

1

Vous cherchez quelque chose comme ça?

select b.* 
    from blog b 
    join blog_tags bt on bt.blog_id = b.id 
    join user_tags ut on ut.tag = bt.tag 
    where ut.user_id = (this_user) 

Contrairement au commentaire, je crois HQL ne permet explicitement des jointures (je peux me tromper, mais voir http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html). Cela peut se faire sans jointures explicites, dans tous les cas:

select b.* 
    from blog b, blog_tags bt, user_tags ut 
    where ut.user_id = (this_user) 
    and bt.blog_id = b.id 
    and ut.tag  = bt.tag 
+0

Assez bien résumé en SQL, sauf que Hibernate n'accepte pas les tables Join dans HQL explicitement. – Sathish

+0

Etes-vous sûr de ça? Voir http://www.hibernate.org/hib_docs/reference/fr/html/queryhql-joins.html – MarkusQ

0

Pour la solution de MarkusQ, j'ai dû déclarer des entités pour les tables de jointure comme UserTag et BlogTag à utiliser dans la requête HQL.

Ma précédente solution de création d'une vue USER_BLOGS était trop lente.

Ceci est la requête HQL qui a travaillé sans nouvelles entités:

select b.* from Blog blog, User user, Tag tag 
where tag in elements (user.tags) 
and tag in elements (blog.tags) 
and user.id = (current_user) 

Si vous trouvez des problèmes dans ce ou de meilleures solutions, s'il vous plaît envoyer vos réponses