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 :

Erreur "Unable to locate appropriate constructor on class" [HQL]


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut Erreur "Unable to locate appropriate constructor on class"
    Bonjour,

    J'ai une erreur
    Unable to locate appropriate constructor on class
    lorsque je passe dans une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public List<com.entreprise.xxx.bean.Vehicule> getVehiculesByVersion(String versionCode) {
            CriteriaBuilder builder = em.getCriteriaBuilder();
            CriteriaQuery<com.entreprise.xxx.bean.Vehicule> criteria = builder.createQuery(com.entreprise.xxx.bean.Vehicule.class);
            Root<AnswerVersion> root = criteria.from(AnswerVersion.class);
            Join<AnswerVersion, Answer> versionAnswers = root.join("answers");
            Join<Answer, Marque> answerMarque= versionAnswers.join("marque");
            Join<Marque, Vehicule> marqueVehicule = answerMarque.join("vehicule");
            criteria.select(builder.construct(com.entreprise.xxx.bean.Vehicule.class,
     marqueVehicule.get("code"), marqueVehicule.get("name"), marqueVehicule.get("entrepot"))).distinct(true);
            criteria.where(builder.equal(root.get("code"), versionCode));
            criteria.orderBy(builder.asc(marqueVehicule.get("name")));
            return em.createQuery(criteria).getResultList();
        }
    Mon bean Vehicule de persistance
    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
        @Id
        @Column(name="CODE", length=3)
        private String code;
        public String getCode() { return code; }
        public void setCode(String code) { this.code = code; }
     
        @Column(name="NAME", length=50, nullable=false)
        private String name;
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
     
        @ManyToOne(targetEntity=Entrepot.class)
        @JoinColumn(name="ENTREPOT_CODE", nullable=false)
        private Entrepot entrepot;
        public Entrepot getEntrepot() { return Entrepot; }
        public void setEntrepot(Entrepot entrepot) { this.Entrepot = entrepot; }
    J'ai donc une liaison entre mon véhicle et mon entrepot via le champ ENTREPOT_CODE.

    Mon bean Vehicule côté métier (pour récupérer un objet Vehicule) :

    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 Vehicule() {}
        public Vehicule(String code, String name, Entrepot entrepot) {
            super();
            this.code = code;
            this.name = name;
            this.entrepot = entrepot;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setEntrepot(Entrepot entrepot) {
            this.entrepot = entrepot;
        }
        public Entrepot getEntrepot() {
            return entrepot;
        }
    trace de l'erreur :

    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
    Caused by: org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.entreprise.xxx.bean.Vehicule] [select distinct new com.entreprise.xxx.bean.Vehicule(generatedAlias0.code, generatedAlias0.name, generatedAlias0.entrepot) from com.entreprise.xxx.persistence.bean.AnswerVersion as generatedAlias1 inner join generatedAlias1.answers as generatedAlias2 inner join generatedAlias2.marque as generatedAlias3 inner join generatedAlias3.vehicule as generatedAlias0 where generatedAlias1.code=:param0 order by generatedAlias0.name asc]
        at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
        at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
        at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
        at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:302)
        ... 39 more
    Je cherche à récupérer mon objet entrepot (ou bien son ENTREPOT_CODE aucune importance), actuellement il m'est impossible de résoudre cette requête.

    Quelqu'un saurait-il me dire où est mon erreur ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ce serait bien de mettre la trace de l'erreur.
    Sinon, tu as créé tes Entity avec un constructeur sans argument ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Ce serait bien de mettre la trace de l'erreur.
    Sinon, tu as créé tes Entity avec un constructeur sans argument ?

    La trace vient d'être aoutée. pour mon entity tu parles de cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Vehicule() { super(); }
    ?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benef Voir le message
    La trace vient d'être aoutée. pour mon entity tu parles de cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Vehicule() { super(); }
    ?
    Oui, sur toutes les Entity.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je crois que ton problème vient de builder.construct(...)
    Il te faut un constructeur pour Vehicule avec les 3 arguments.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Oui sur toutes mes Entity...
    Mon constructeur est de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public Vehicule(String code, String name, Entrepot entrepot) {
    		super();
    		this.code = code;
    		this.name = name;
    		this.entrepot = entrepot;
    	}
    .

    En fait ce qui je pense peut poser problème c'est parce que mon bean de persistance Vehicule fait référence à l'objet Entrepot via le champ ENTREPOT_CODE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	@ManyToOne(targetEntity=Entrepot.class)
    	@JoinColumn(name="ENTREPOT_CODE", nullable=false)
    	private Entrepot entrepot;
    	public Entrepot getEntrepot() { return entrepot; }
    	public void setEntrepot(Entrepot entrepot) { this.entrepot = entrepot; }

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    En tout cas, il attend un constructeur correspondant à ce que te retourne
    marqueVehicule.get("code"), marqueVehicule.get("name"), marqueVehicule.get("entrepot")
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    En tout cas, il attend un constructeur correspondant à ce que te retourne

    Oui mais le bean de persistance tout comme la BDD ne connait que le CODE_ENTREPOT (clef étrangère) serait-ce l'erreur ?

  9. #9
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    J'ai jamais utilisé QueryCriteria mais à vu d'oeil dans la requette JPQL généré il n'y a pas de référence vers la classe entrepôt. Si ton entrepôt est chargé en mode Lazy, lors de la sérialisation quand tu construiras ton Véhicule, Hibernate n'arrivera pas à instancier l'entrepôt car il n'arrivera pas à le mapper.
    Essaye d'ajouter un Join<Vehicule,Entrepot>.

    C'est une idée intéressante, après c'est ça?????

    Tiens moi au courant.

    Merci

  10. #10
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Citation Envoyé par supergeoffrey Voir le message
    J'ai jamais utilisé QueryCriteria mais à vu d'oeil dans la requette JPQL généré il n'y a pas de référence vers la classe entrepôt. Si ton entrepôt est chargé en mode Lazy, lors de la sérialisation quand tu construiras ton Véhicule, Hibernate n'arrivera pas à instancier l'entrepôt car il n'arrivera pas à le mapper.
    Essaye d'ajouter un Join<Vehicule,Entrepot>.

    C'est une idée intéressante, après c'est ça?????

    Tiens moi au courant.

    Merci
    Je suis en train de tester, par contre non je ne suis pas en Lazy

  11. #11
    Membre actif
    Profil pro
    Développeur kobo
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur kobo

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Citation Envoyé par supergeoffrey Voir le message
    J'ai jamais utilisé QueryCriteria mais à vu d'oeil dans la requette JPQL généré il n'y a pas de référence vers la classe entrepôt. Si ton entrepôt est chargé en mode Lazy, lors de la sérialisation quand tu construiras ton Véhicule, Hibernate n'arrivera pas à instancier l'entrepôt car il n'arrivera pas à le mapper.
    Essaye d'ajouter un Join<Vehicule,Entrepot>.

    C'est une idée intéressante, après c'est ça?????

    Tiens moi au courant.

    Merci
    Et non ça ne marche pas, par contre une fois le Join<Vehicule,Entrepot>. dois-je remplacer marqueVehicule.get("entrepot") par vehiculeEntrepot.get("entrepot") ?

    Edit : maintenant cela marche, il suffisait d'ajouter la jointure et vehiculeEntrepot.get("code") puis :

    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
    26
    27
    28
     
     
        // declaration etc...
     
        public Vehicule(String code, String name, String entrepot_code) {
            super();
            this.code = code;
            this.name = name;
            this.entrepot_code = entrepot_code;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setEntrepot_code(String entrepot_code) {
            this.entrepot_code = entrepot_code;
        }
        public String getEntrepot_code() {
            return entrepot_code;
        }

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

Discussions similaires

  1. Erreur "Unable to locate tools.jar"
    Par kitcarson23 dans le forum Glassfish et Payara
    Réponses: 4
    Dernier message: 19/01/2015, 19h43
  2. Réponses: 3
    Dernier message: 13/01/2012, 17h50
  3. Réponses: 6
    Dernier message: 25/12/2011, 13h06
  4. Install Eclipse PDT Vista : erreur Unable to locate...
    Par Trigone7 dans le forum Eclipse PHP
    Réponses: 4
    Dernier message: 31/07/2009, 17h41
  5. Réponses: 4
    Dernier message: 07/10/2005, 15h28

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