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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Points : 9 529
    Points
    9 529
    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 ?

  3. #3
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Points : 9 529
    Points
    9 529
    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.

  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
    Points : 9 529
    Points
    9 529
    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.

  6. #6
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Points : 9 529
    Points
    9 529
    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")

  8. #8
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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 expérimenté 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 : 37
    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
    Points : 1 698
    Points
    1 698
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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