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 :

Ma clé primaire est un objet


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut Ma clé primaire est un objet
    Bonjour,

    Je dois faire une requête sur une table qui a une clé primaire composée :
    - la première partie de la clé est un objet (Procedure). La clé de cet objet est elle même composée
    - la seconde est un entier

    Mais quand je fais une simple requête ca me génère l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    org.hibernate.QueryException: Expected positional parameter count: 2, actual parameters: [bean.Procedure@bea, 43] [
    		from Mail
    		where procedure = ?
    			and codeMail = ?
    Pour exécuter ma requête je fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           Query q = s.getNamedQuery("mail.par.code");
    	q.setParameter(0,p);
    	q.setInteger(1,codeMail);
    	m = (Mail)q.uniqueResult();
    je ne suis pas sûre de pouvoir passer en paramètre de ma requête un objet, mais je ne vois pas d'autre solution vu mon mapping !

    Comment pourrais-je faire ?

  2. #2
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Tu ne peux pas essayer de passer directement par les clés plutot que par l'objet procédure ?

    Je ne garantis pas que ce que tu fais actuellement fonctionne ... cependant il est aussi possible de faire ce que tu veux avec l'API criteria.

    Il est alors possible d'ajouter les Example dans lequel tu pourras dès lors passer ton objet Procédure en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria crit = session.createCriteria(Mail.class)
                        .add(Restrictions.eq("codeMail",varCodeMail))
                        .createCriteria(Procedure.class)
                             .add(Example.create(p));
    crit.uniqueResult();

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Salut,

    Je comprends pas très bien la requête que tu veux que je fasse, je suppose que tu ne veux créer qu'une requête,alors pourquoi rajouter la ligne "createCriteria(Procedure.class)" ?

  4. #4
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Via l'API Criteria, cet appel effectue une "jointure" d'objet... note la nuance avec l'autre "createCriteria(Class)" ... le premier est une méthode de Session alors que le second est une méthode de Criteria ... leur utilité est différente. Je sais, c'est plutot ambigu mais ca fonctionne ainsi

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    J'ai modifié légèrement ton script comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria crit = s.createCriteria(Mail.class);
    	    crit.add(Restrictions.eq("codeMail",String.valueOf(codeMail)));
                crit.createCriteria("procedure");
                crit.add(Example.create(p));
                m = (Mail)crit.uniqueResult();
    C'était ca ton idée ?

  6. #6
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Ah ui pardon, c'est bien ainsi, je me suis trompé dans la signature toutes mes excuses

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Car "monCriteria.CreateCriteria(Class)" ne fais pas parti de la liste des méthodes, seul "monCriteria.CreateCriteria(String)" existe

  8. #8
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    C'est pas grave, tu es déjà bien sympa de m'aider

    Alors j'ai testé, j'ai l'impression que la méthode est bonne, mais il me fait un CastClassException un peu bizarre puisqu'il me met monPackage.maClasse.$$EnhancerByCGLIB$$56fc9662 ???

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/08/2007, 10h28
  2. Réponses: 3
    Dernier message: 15/02/2007, 12h02
  3. [Clés primaires] Est ce possible de les modifier ?
    Par dynexd dans le forum Access
    Réponses: 3
    Dernier message: 29/09/2006, 14h03
  4. Réponses: 1
    Dernier message: 14/04/2006, 21h46
  5. [c#] Quel est cet objet ?
    Par SDuh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/02/2006, 13h27

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