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 :

Aide pour créer un Criteria


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut Aide pour créer un Criteria
    Bonjour,

    J'ai un soucis pour écrire une requête avec les objects criteria.

    Mon modèle définit des personnes (Person), des affiliations (Affiliate) et des tâches (UpdateRequest). Une tâche peut être assignée à une personne ou à une affiliation.

    Ce que je tente d'obtenir, c'est la liste des tâches à faire étant donné le nom d'une personne, que la tâche soit liée à son affiliation ou a sa personne.

    Le code SQL que je désire obtenir est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select this_.*, person1_.*, affiliate2_.*, person3_.* 
    from UpdateRequest this_ 
    left outer join Person person1_ on this_.personId=person1_.id 
    left outer join Affiliate affiliate2_ on this_.AffiliateId=affiliate2_.id 
    left outer join Person person3_ on affiliate2_.personId=person3_.id 
    where (lower(person1_.name) like 'dupont') or (lower(person3_.name) like 'dupont')
    Voici le code java que j'ai tenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Criteria criteria = getSession().createCriteria(UpdateRequest.class);
    Criteria subscriberCriteria = criteria.createCriteria("person", CriteriaSpecification.LEFT_JOIN);
    Criteria affiliateCriteria = criteria.createCriteria("affiliate", CriteriaSpecification.LEFT_JOIN);
    Criteria personCriteria = affiliateCriteria.createCriteria("person", CriteriaSpecification.LEFT_JOIN);
    subscriberCriteria.add(Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE));
    personCriteria.add(Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE));
    Le soucis, c'est que ce code me génère le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select this_.*, person1_.*, affiliate2_.*, person3_.* 
    from UpdateRequest this_ 
    left outer join Person person1_ on this_.personId=person1_.id 
    left outer join Affiliate affiliate2_ on this_.AffiliateId=affiliate2_.id 
    left outer join Person person3_ on affiliate2_.personId=person3_.id 
    where (lower(person1_.name) like 'dupont') and (lower(person3_.name) like 'dupont')
    Faire des restrictions sur deux subqueries se tranduit par un AND, mais moi je voudrais un OR.

    Comment faire?

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    teste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    personCriteria.add(Restrictions.or(Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE)));

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ce que tu suggères ne compile pas : Restrictions.or prend deux arguments.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Le code ci-dessous ne fonctionne peur-être pas tel quel ( juste une piste)
    ( c'est aussi possible d'avoir une syntaxe similaire avec le Restriction.Or ).
    La création des Alias est certainement fausse, il faudrat que tu l'adaptes à ton modèle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Criteria criteria = getSession().createCriteria(UpdateRequest.class)
                                    .createAlias("person", "person", CriteriaSpecification.LEFT_JOIN)
                                    .createAlias("affiliate", "affiliate", CriteriaSpecification.LEFT_JOIN)
                                    .createAlias("affiliate.person", "person2", CriteriaSpecification.LEFT_JOIN); // là je ne suis pas du tout sur de la syntaxe
     
    criteria.add(Restriction.disjunction().add(Restriction.ilike("person.name",searchValue)) 
    .add(Restriction.ilike("person2.name",searchValue)));

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    C'est super, ça fonctionne! La solution est effectivement de ne pas passer par des subqueries, mais de rester au niveau du criteria de base.

    Pour ceux que ça intéresse, voici le code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Criteria criteria = getSession().createCriteria(UpdateRequest.class);
    criteria.createAlias("person", "person", CriteriaSpecification.LEFT_JOIN);
    criteria.createAlias("affiliate", "affiliate", CriteriaSpecification.LEFT_JOIN);//obligatoire sinon ça plante
    criteria.createAlias("affiliate.person", "affiliatePerson", CriteriaSpecification.LEFT_JOIN);
    criteria.add(Restrictions.or(Restrictions.ilike("person.name", searchValue, MatchMode.ANYWHERE),
        Restrictions.ilike("affiliatePerson.name", searchValue, MatchMode.ANYWHERE));
    Il y a une chose que j'aimerai que tu m'expliques : createCriteria peut prendre en paramètre le nom d'un alias, et createAlias retourne aussi un Criteria. Quelle différence il y a-t-il alors entre les deux? J'ai testé, ça fonctionne d'ailleurs avec les deux...

    Merci beaucoup en tout cas!

Discussions similaires

  1. Aide pour créer mon site, aidez moi.
    Par ganon551 dans le forum Mon site
    Réponses: 24
    Dernier message: 30/06/2006, 19h45
  2. aide pour créer une faq sur inno setup
    Par fsx999 dans le forum Langage
    Réponses: 3
    Dernier message: 12/06/2006, 20h16
  3. besoin d'aide pour créer un uml
    Par bob75018 dans le forum UML
    Réponses: 9
    Dernier message: 11/03/2006, 12h18
  4. aide pour créer un jeu
    Par cstefany dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/10/2005, 03h51
  5. [FLASH MX2004] Aide pour créer une animation
    Par SnakeTales dans le forum Flash
    Réponses: 5
    Dernier message: 04/08/2005, 10h50

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