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 :

faire un createCriteria sous condition


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut faire un createCriteria sous condition
    Bonjour les gens,

    bon ça fait 2 heures que je cherche et je n'arrive pas à trouver la solution donc je sollicite l'aide d'une bonne âme charitable.

    J'ai 2 objets mappés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ObjetPapa  implements java.io.Serializable {
         ...
         private ObjetFils objetFils;
         ...
    }
     
    public class ObjetFils  implements java.io.Serializable {
         ...
         private long id;
         private String param;
         ...
    }
    Côté base de données, j'ai ma table représentant ObjetPapa remplie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    idObjetPapa    idObjetFils
        1              5
        2              8
        3              0
        4              15
        5              0
        6              17
    etc...
    Pré-requis :
    les enregistrement en base, qui viennent d'une autre application, auraient du être renseignées avec la valeur null dans idObjetFils si jamais ObjetPapa n'avait pas d'ObjetFils, mais ce n'est pas le cas. Au lieu de ça, ils sont enregistrés avec idObjetFils=0. C'est comme ça, c'est moche mais je ne peut rien y faire.

    Donc mon soucis est le suivant :
    Je veux faire une requête qui récupère
    • tous les ObjetPapa qui ont un ObjetFils tel que param="toto"
      ET
    • tous les ObjetPapa qui n'ont pas d'ObjetFils (idObjetFils=0)


    j'arrive à faire les deux requêtes distinctes qui sont respectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Criteria criteria = sessionFactory.getCurrentSession()
               .createCriteria(ObjetPapa.class);
    criteria.add(Restrictions.eq("objetFils.id", 0);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Criteria criteria = sessionFactory.getCurrentSession()
               .createCriteria(ObjetPapa.class);
    Criteria criteriaFils = criteria.createCriteria("objetFils");
    criteriaFils.add(Restrictions.eq("param","toto"));
    Cependant, je n'arrive pas à obtenir une unique requête qui me retourne tous les enregistrements à la fois.
    Est-ce qu'il existe une façon de faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Criteria criteria = sessionFactory.getCurrentSession()
             .createCriteria(ObjetPapa.class);
    Criterion critZero = Restrictions.eq("objetFils.id", 0);
    Criteria criteriaFils = criteria.createCriteria("objetFils");
    criteriaFils.add(Restrictions.eq("param","toto"));
    criteria.add(Restrictions.or(critZero,criteriaFils));
    Merci d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Bon, j'ai finalement trouvé, je poste la réponse, au cas où...

    En gros :
    1. il fallait faire une jointure externe sur le criteria d'ObjetFils afin qu'il récupère quand même tous les ObjetPapa tels que idObjetFils =0
    2. il fallait faire un createCriteria avec alias sur ObjetFils pour pouvoir par la suite créer un Criterion. C'est ce Criterion qui va au final dans la clause or


    Note : En fait, ce que j'ai posté dans ma question aurait pu être simplement réalisé en faisant une restriction telle que : Restrictions.eq("ObjetFils.param","toto"). Cependant, j'avais en fait deux niveaux d'objets et Restrictions.eq("ObjetFils.ObjetPetitFils.param","toto"), çà, ça ne marche pas. J'avais simplifié pour pas s'embêter

    Donc, avec les deux niveaux d'objet ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Criteria criteria = sessionFactory.getCurrentSession()
              .createCriteria(ObjetPapa.class);
     
    Criterion criterionIdZero = Restrictions.eq("objetFils.id", 0);
     
    Criteria criteriaObjetFils = criteria
             .createCriteria("objetPetitFils",Criteria.LEFT_JOIN);
    Criteria criteriaObjetPetitFils = criteriaObjetFils
             .createCriteria("objetPetitFils","aliasObjetPetitFils",Criteria.LEFT_JOIN);
     
    Criterion criterionPetitFils = Restrictions.eq("aliasObjetPetitFils.param","toto")); 
     
    criteria.add(Restrictions.or(criterionIdZero, criterionPetitFils));

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

Discussions similaires

  1. Faire des calcules sous condition
    Par naim216 dans le forum kettle/PDI
    Réponses: 1
    Dernier message: 01/07/2013, 15h15
  2. Faire clignoter cellules sous condition
    Par target111 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/04/2013, 00h07
  3. Faire une somme sous condition
    Par passio dans le forum Excel
    Réponses: 3
    Dernier message: 12/01/2012, 23h09
  4. Faire une somme sous condition
    Par maystreet dans le forum Deski
    Réponses: 1
    Dernier message: 16/03/2009, 16h43
  5. autoexec sous condition?comment faire?
    Par polianita dans le forum Access
    Réponses: 2
    Dernier message: 12/07/2006, 11h57

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