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

Hibernate Java Discussion :

Criteria et association unidirectionnelle


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut Criteria et association unidirectionnelle
    Bonjour, le titre n'est pas très clair mais je vais expliquer mon problème le plus simplement possible:

    J'ai une classe enfant qui est associée a une classe parent en ManyToOne, je voudrais faire une requête à l'aide l'API criteria qui me retournerais les parents dont les enfants restectent des critères de recherche.

    Classe enfant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Enfant {
    [...]
    @ManyToOne
    private Parent parent;
    [...]
    }
    Classe parente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Parent{
    [...]
    // Propriétés de la classe
    // Pas d'association OneToMany
    [...]
    }
    Je voudrais faire ma requête ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Criteria crit = session.createCriteria(Parent.class);
     
    // Incorrect mais ca donne une idée de ce que je veux faire
    Criteria crit2 = crit.createCriteria("enfant.parent=this", "enfant");
     
    crit2.add(Restrictions.like("exemple", value);
     
    return crit.list()
    Est-il possible de créer un sous-criteria avec une association inversée ou connaissez-vous une méthode pour faire ce que je veux faire?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 18
    Par défaut
    Normalement tu dois pouvoir le faire avec le CreateAlias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria crit = session.createCriteria(Parent.class);
    crit.createCriteria("enfant.parent", "parent");
    crit.add(Restrictions.like("parent.nom", "Dupont");
     
    return crit.list();
    Si je ne me trompe pas, ca te renvoit la liste des enfants dont le nom d'un des parents est Dupont.

    ATTENTION c'est un OU. Si tu veux que tous les parents respectent la condition, il va falloir certainement passer par la table de jointure.

  3. #3
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Je crois que tu t'es un peu mélangé les pinceaux, mon post n'est pas assez clair on dirait. Ma classe "Parent" ne contient pas de propriété enfant, l'enfant par contre, a une propriété parent.

    Je récapitule, je veux la liste des parents dont l'enfant respecte un critère. Je veux réaliser une jointure avec la clef dans l'entité fille.

    En SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT p.*
    FROM Parent p LEFT JOIN Enfant e ON e.parent = p.id
    WHERE e.exemple = "value";
    Dans ta réponse "enfant" ne me semble pas exister, corriges-moi si je me trompe...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 18
    Par défaut
    Désoler, j'avais mal compris ta question, et en plus en effet je me suis trompé dans le createAlias...

    En revanche tu peut simplement chercher la liste des enfants qui correspondent à ton critère. Après comme tu as déclaré le many-to-one, hibernate se charge de récupéré la liste des parents. Il ne te reste qu'à concaténé les listes de parents ainsi récupéré.

    J'avais essayé une fois de faire ce que tu recherche, mais je n'ai rien trouvé dans ce sens. Alors passe par la classe enfant.

  5. #5
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    J'y ai pensé mais quand tu as plusieurs types d'enfants, ça n'est plus possible...

    Merci d'avoir essayé, il n'y peut être pas solution, d'autres idées?

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2013, 11h16
  2. Association avec Criteria
    Par lamis2009 dans le forum Hibernate
    Réponses: 9
    Dernier message: 18/06/2010, 19h25
  3. [Liferay] Exception lors d'utilisation des associations avec criteria
    Par lamis2009 dans le forum Portails
    Réponses: 0
    Dernier message: 17/06/2010, 18h09
  4. Une association unidirectionnelle basée sur Set
    Par grizzz dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/09/2008, 08h18
  5. Réponses: 2
    Dernier message: 10/08/2007, 11h46

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