Bonjour à tous, j'ai eu beau chercher pendant un moment, je n'ai pas trouvé de réponses à mon problème. Je fais une application en JSF, EclipseLink, Glassfish qui dispose d'utilisateur qui peut avoir un ou plusieurs groupes. L'application disposent de modules et des permissions comme suit :
Module => permission => utilisateur
Module => permission => groupe => utilisateur
Je cherche en criteria query (et non en jpql) à obtenir tous les modules d'un utilisateur. J'ai construit ma requête SQL qui fonctionne très bien que voici
J'essaie tant bien que mal de la transformer en criteria query sans grand succès. J'ai déjà commencé par la première sous requête qui me donne les modules dont à accès en direct un utilisateur. J'ai l'impression qui me manque des conditions ou des jointures puisque j'obtiens 2 résultats alors que je ne devrais en avoir qu'un. En effet, je n'arrive pas à positionner mes clauses ON, puis je ne peux pas ajouter mes tables de jointures dans ma requête puisque ces entités n'existent pas : je m'explique la table modules_permissions, est créée par un @ManyToMany dans mes entités ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 SELECT * FROM core_module m WHERE m.id IN ( SELECT m.id FROM core_module m INNER JOIN modules_permissions mp ON mp.modules_id = m.id INNER JOIN core_permission p ON p.id = mp.permissions_id INNER JOIN users_permissions up ON p.id = up.permissions_id INNER JOIN core_user u ON u.id = 1 ) OR m.id IN ( SELECT m.id FROM core_module m INNER JOIN modules_permissions mp ON m.id = mp.modules_id INNER JOIN core_permission p ON p.id = mp.permissions_id INNER JOIN groups_permissions gp ON gp.permissions_id = p.id INNER JOIN core_group g ON g.id = gp.groups_id INNER JOIN users_groups ug ON g.id = ug.groups_id INNER JOIN core_user u ON u.id = ug.users_id WHERE u.id = 1 )
Voici mon ébauche de première sous requête :
Merci beaucoup pour votre aide... en pièce jointe mes entities et ma classe de dao. Je suis dessus depuis 2 jours je n'en peux plus ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 List<Module> modules; CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); CriteriaQuery<Module> query = cb.createQuery(Module.class); Root<Module> root_module = query.from(Module.class); Root<User> root_user = query.from(User.class); Root<Permission> root_permission = query.from(Permission.class); Root<Group> root_group = query.from(Group.class); Join<Module, Permission> join_module_permission = root_module.join(Module_.permissions); Join<Permission, User> join_permission_user = root_permission.join(Permission_.users); query.where(cb.equal(root_user.get(User_.email), current.getEmail())); modules = getEntityManager().createQuery(query).getResultList();
Partager