IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

JPA Criteria JOIN et ON


Sujet :

JPA Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut JPA Criteria JOIN et ON
    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

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

    Voici mon ébauche de première sous requête :

    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();
    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 ...
    Fichiers attachés Fichiers attachés

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Petit UP par rapport à ma demande, voici la requête JPQL associée qui fonctionne a merveille mais j'aimerais beaucoup la convertir en criteria query...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select m from Module m where m.id in (select m1.id from Module m1 join m1.permissions p join p.users u where u.id = :userid) or m.id in (select m2.id from Module m2 join m2.permissions p2 join p2.groups g join g.users u2 where u2.id = :userid)
    Merci de votre aide

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut La solution
    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
     
            CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
            CriteriaQuery<Module> query = cb.createQuery(Module.class);
     
            Root<Module> root_module = query.from(Module.class);
            Path path = root_module.get(Module_.id);
     
            Subquery<Integer> subquery = query.subquery(Integer.class);
            Root subRoot = subquery.from(Module.class);
            subquery.select(subRoot.get((Module_.id)));
            Join user1 = subRoot.join(Module_.permissions).join(Permission_.users);
            subquery.where(cb.equal(user1.get(User_.id), current.getId()));
     
            Subquery<Integer> subquery2 = query.subquery(Integer.class);
            Root subRoot2 = subquery.from(Module.class);
            subquery2.select(subRoot2.get((Module_.id)));
            Join user2 = subRoot2.join(Module_.permissions).join(Permission_.groups).join(Group_.users);
            subquery2.where(cb.equal(user2.get(User_.id), current.getId()));
     
            query.where(cb.or(cb.in(path).value(subquery), cb.in(path).value(subquery2)));
            modules = getEntityManager().createQuery(query).getResultList();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Criteria Join SubQuery
    Par HadanMarv dans le forum JPA
    Réponses: 4
    Dernier message: 12/06/2012, 18h22
  2. [Criteria] ne pas prendre toutes les colonnes dans un Join
    Par Sniper37 dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/03/2009, 19h30
  3. Criteria,FetchMode.JOIN et collection
    Par Eccoon dans le forum Hibernate
    Réponses: 2
    Dernier message: 11/03/2009, 15h00
  4. Criteria force inner join
    Par grizzz dans le forum Hibernate
    Réponses: 0
    Dernier message: 18/09/2008, 15h19
  5. utiliser Criteria pour un JOIN WITH
    Par Naeco dans le forum Hibernate
    Réponses: 2
    Dernier message: 24/06/2008, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo