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 :

Problème de jointure/requête [HQL]


Sujet :

Hibernate Java

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    Ok autant pour moi, effectivement EntityManager ne peut pas renvoyer un org.hibernate.Query...

    J'ai repensé à ton problème, je pense que ça vient des valeurs que tu passes à setParameter. En particulier le numCompte, je pense que tu dois passer une variable de type int (ou String ?), au lieu d'un Integer. Pour convertir un int en Integer il faut faire : Integer.valueOf(int)

    Ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query q = em.createQuery("from Compte as compte JOIN FETCH compte.client as client where compte.numcompte = :numcompte and client.codesecret = :codesecret");
    q.setParameter("numcompte", Integer.valueOf(numcompte));
    q.setParameter("codesecret", codesecret);
    Romain.

  2. #22
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Justement non le soucis est que :

    - numcompte il veut du String et rien d'autre, quand je le converti en Integer, il me génère une erreur
    - codesecret veut du Integer, sauf que quand justement je le converti avec (Integer), new Integer (codesecret), Integer.valueOf(codesecret) ou encore Integer.parseInt(codesecret), il me génère toujours l'erreur de vouloir du Integer

    Je lui donne du Integer, mais il dit qu'il lui faut encore du Integer car le type que je lui envoi ne lui convient pas, je comprend absolument rien.

    19:53:37,594 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/ProjetDistributeurWeb].[ServletConnexion]] (http-localhost-127.0.0.1-8080-1) "Servlet.service()" pour la servlet ServletConnexion a généré une exception: javax.ejb.EJBException: java.lang.IllegalArgumentException: Parameter value [2] did not match expected type [java.lang.Integer]

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    Quand on regarde ta classe Compte :

    Donc pour numcompte c'est un int qui devrait théoriquement être passé pour numcompte

    Quand on regarde Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String codesecret;
    Donc pour numcompte c'est un String qui devrait théoriquement être passé pour codesecret.

    Essai de faire ce test et si ça ne marche pas, tu peux essayer de changer la signature de numcompte dans ta classe Compte, pour que ça devienne un Integer, ça ira peut-être mieux mais je ne suis pas convaincu...

    Après je sèche... Tu peux nous montrer la partie de code sur l'exécution de ta query (createQuery, setParameter) ? Et bien nous dire le type de tes variables...

    Romain.

  4. #24
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    numCompte est int, or setParameter attend en paramètre un String et un Object. Or dans ton cas c'est int(type simple) à la place de Integer.

    voici la signature de setParameter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Query setParameter(java.lang.String name, java.lang.Object value)
    soit tu encapsules le type int dans la classe Integer pour avoir un object: new Integer(numCompte) ,soit tu changes tous les types int des Entities en type Integer

  5. #25
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Boolean connexion(Object numcompte, Object codesecret){
     
        	Boolean result = false;
     
        	Query q = em.createQuery("from Compte as compte JOIN FETCH compte.client as c where compte.numcompte = :numcompte and c.codesecret = :codesecret");
            q.setParameter("numcompte", numcompte);
            q.setParameter("codesecret", codesecret);
     
        	if(q.getResultList().size() == 1)
        		result = true;
     
        	return result;
        }
    Voila actuellement la BASE sur quoi je travail, il faut savoir que pour numcompte, il veut que je le converti en String, donc normalement il devrait y avoir (String) numcompte, et dans se cas je n'ai aucun soucis avec numcompte, ce qui est totalement illogique vu que mon numcompte est de type int dans mon entity.

    Maintenant pour codesecret, comme je l'ai dit, j'ai essayer de le convertir en String, il ne voulait pas, ensuite je l'ai converti en entier avec les méthodes suivants :
    new Integer(codesecret)
    (Integer) codesecret
    Integer.parseInt(codesecret)
    Integer.valueOf(codesecret)
    Mais rien a faire, je reçois toujours un message comme quoi le type ne convient pas ...

    Moi même je sèche également.

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    new Integer(codesecret)
    (Integer) codesecret
    Integer.parseInt(codesecret)
    Integer.valueOf(codesecret)
    Tout ça c'est pas bon ! codesecret est de type String (cf ta classe Client), donc tu ne devrait pas essayer de le convertir en Integer.

    Je comprends mieux tes soucis en voyant la signature de ta méthode connexion... C'est pas terrible la signature de ta méthode, c'est pas bon de travailler sur des Object comme ça... La signature de ta méthode devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Boolean connexion(Integer numcompte, String codesecret){
    // même code que dans ton message précédent
    }
    Typer des paramètres en Object revient à ne pas typer une méthode. Hors Java est un langage se voulant type, il faut respecter cette orientation.

    Si tu veux rester avec une signature avec des Object il faut que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Boolean connexion(Object numcompte, Object codesecret){
     
        	Boolean result = false;
     
        	Query q = em.createQuery("from Compte as compte JOIN FETCH compte.client as c where compte.numcompte = :numcompte and c.codesecret = :codesecret");
            q.setParameter("numcompte", Integer.valueOf(numcompte)); // car numcompte est un int dans Compte
            q.setParameter("codesecret", String.valueOf(codesecret)); // car codesecret est un String dans Client
     
        	if(q.getResultList().size() == 1)
        		result = true;
     
        	return result;
        }


    Romain.

  7. #27
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    il est inutile de convertir , il faut juste modifier la signature de la méthode connexion(comme l'a suggéré le précédent intervenant). De même la signature de la méthode setParameter() est très claire il suffit de regarder l'API java pour être certain des types requis dans ton cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public Boolean connexion(Integer numcompte, String codesecret){
     
           q.setParameter("numcompte", numcompte);
            q.setParameter("codesecret", codesecret);
    }

  8. #28
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    En faite le soucis n'était pas du tout ici ! Le soucis est que avant d'être dans mon EJB, je récupère des données dans une ArrayList qui est dans une servlet puis je renvoi le tous à mon EJB.

    Le soucis est que bêtement je n'avais pas instancier mon ArrayList ... (honte a moi)

    L'autre chose est que en faite, il y avait beaucoup plus simple en requête, celle-ci suffisait amplement pour récupérer le client et ses opérations puisque le HQL se charge de faire le sale boulot.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public ArrayList<Object> connexion(int numcompte, String codesecret){
     
        	// Déclaration de la variable de renvoi
        	ArrayList<Object> renvoi = new ArrayList<Object>();
     
        	renvoi.add(false);
     
        	// Requête HQL
        	Query q = em.createQuery("from Compte where numcompte = :numcompte");
        	q.setParameter("numcompte", numcompte);
     
        	// Vérification du nombre de résultats
        	if(q.getResultList().size() > 0)
        	{
    	    	Compte compte = (Compte)q.getSingleResult();
    	    	Client client = compte.getClient();
     
    	    	if(client.getCodesecret().equalsIgnoreCase((String)codesecret))
    	    		renvoi.set(0,true);
     
    	    	renvoi.add(compte);
        	}
     
        	return renvoi;
        }
    Je vous remercie énormément pour votre aide, cela ma aider grandement dans ma compréhension du HQL

    Sujet clos

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/12/2007, 22h28
  2. Réponses: 24
    Dernier message: 24/07/2007, 17h48
  3. [MySQL] problème dans ma requête de jointure
    Par kawther dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2007, 22h50
  4. [Requête] Problème de jointure
    Par Oilcout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/03/2007, 16h54
  5. [Requêtes SQL] Problème de jointure ?
    Par soso78 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 18/12/2006, 15h37

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