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 :

paramètre dans un where d'un set


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Par défaut paramètre dans un where d'un set
    Bonjour !!

    Je voulais savoir si c'était possible de faire ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <set name="name" table="kind_lang" where="langabrev=:abrev" lazy="false">
    	<key column="kindid" />
    	<one-to-many class="KindLangVO" />
    </set>
    En gros, pouvoir passer un paramètre dans la clause where de mon "set". Lorsque je passe une valeur en dur, genre where="langabrev='fr'" ça fonctionne, mais je ne sais pas comment le passer en tant que paramètre dynamique... J'ai tenté des trucs du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // get the current session
    Session s = HibernateUtil.getSessionFactory().getCurrentSession();
     
    // create transaction, set query/params and commit transaction
    s.beginTransaction();
    List l = s.createQuery("From KindVO where group=:group and abrev=:abrev")
    			.setInteger("group", groupid )
    			.setString("abrev", "fr")
    			.list();
    s.getTransaction().commit();
     
    return l;
    mais ça ne fonctionne pas...


    En gros, j'ai une table kind (kindid, kindgroup, kindweight), ainsi qu'une table kind_lang (kindid, langabrev, kind_langname), la seconde contenant les traductions de la table kind.

    Dans l'idéal, j'aurai aimé récupérer directement kindid, kindgroup, kindweight et kind_langname en spécifiant le paramètre "langabrev" pour ne récupérer que les traductions dans une langue précise, mais je ne crois pas que ça soit possible... Donc je tente avec une classe KindLangVO, ainsi qu'une classe KindLangId pour la clé composite (kindid-langabrev). Seulement je ne vois toujours pas comment passer un paramètre...

    Si vous avez des suggestions pour une solution ou une autre par rapport à mes besoins, je suis à l'écoute

    D'avance merci.


    Thierry

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    La clause "where" dans le mapping doit désigner une clause en SQL, donc à priori incompatible avec un paramètre sauce Hibernate. Dans le doute j'aurais bien essayé avec ton mapping la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List l = s.createQuery("From KindVO where group=:group")
    			.setInteger("group", groupid )
    			.setString("abrev", "fr")
    			.list();
    Une autre technique à base de HQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select new mon.package.MonObjet(les attributs)
    from
       KindVO v
       inner join v.name n
    where
       v.id = ...
       and n.langabrev = 'FR'
    Ce qui permet de construire un objet à partir d'une requête, avec la restriction qui va bien sur la langue. Ca permet de garder un mapping propre, qui respecte le modèle physique avec une association one to many.

    Une autre qui existe à base de "subselect" dans le fichier de mapping, mais là non plus je ne suis pas sur que l'on puisse passer des paramètres.

  3. #3
    Membre chevronné Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Par défaut
    Hello,

    Par rapport à ton premier exemple, j'avais déjà tenté le coup, mais il me balance une erreur comme quoi la requête ne requiert aucun attribut nommé "abrev", donc pas mieux.

    Je n'ai pas tenté les autres solutions, car entre temps j'ai trouvé une petite astuce qui fonctionne nickel (merci "Java persistance with hibernate" ) : l'utilisation de filtre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	<class ...>
    		...
    		<set name="name" table="kind_lang" lazy="false">
    			<key column="kindid" />
    			<one-to-many class="KindLangVO" />
    			<filter name="filterLanguage" condition="langabrev=:langabrev" />
    		</set>
    	</class>
     
    	<filter-def name="filterLanguage">
    		<filter-param name="langabrev" type="string" />
    	</filter-def>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // get the current session
    Session s = HibernateUtil.getSessionFactory().getCurrentSession();
     
    // create transaction, set query/params and commit transaction
    s.beginTransaction();
     
    Filter filter = s.enableFilter("filterLanguage");
    filter.setParameter("langabrev", "en");
     
    List l = s.createQuery("From KindVO where group=:group")
    			.setInteger("group", groupid )
    			.list();
    s.getTransaction().commit();
    Et paf, le tour est joué

    En espérant que ça puisse servir à d'autres

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2015, 16h12
  2. Réponses: 3
    Dernier message: 07/01/2014, 11h46
  3. problème de paramètre dans le where
    Par rominous41 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/05/2011, 15h21
  4. Ajout de paramètres dans le path du forward
    Par sylvain_neus dans le forum Struts 1
    Réponses: 6
    Dernier message: 14/11/2007, 17h31
  5. [CR] insérer une image paramétrer dans une étiquette
    Par yoyothebest dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 22/08/2004, 11h58

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