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 :

SQL Query : org.hibernate.PropertyNotFoundException [HQL]


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Points : 261
    Points
    261
    Par défaut SQL Query : org.hibernate.PropertyNotFoundException
    Bonjour,
    J'essaie de faire une requete afin de récupérer une listes de mes entité mais je n'y arrive toujours pas. En fait j'ait deux entité ( Entity ) : Brochure et HistoBrohure. HistoBrohure peut contenir plusieurs lignes de brochures pour simplifier ( Many To One de HistoBrochure vers Brochure ). J'utilise la base de données Mysql 5.1 et Hibernate 3.2.0.ga.
    Voici le code des mes entités, j'ai supprimé certains attributes pour simplifier les classes :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    @Entity
    @Table(name="BROCHURE")
    public class Brochure {
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	@Column(name="ID_BROCHURE")
    	private Long id;
     
    	@Column(name="AUTEUR", length=50)
    	private String auteur;
     
    	@Transient
    	private Integer statutId;
     
     
    	public Long getId() {
    		return id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	public String getAuteur() {
    		return auteur;
    	}
     
    	public void setAuteur(String auteur) {
    		this.auteur = auteur;
    	}
     
    	public Integer getStatutId() {
    		return statutId;
    	}
     
    	public void setStatutId(Integer statutId) {
    		this.statutId = statutId;
    	}
    }
     
    @Table(name="HISTO_BROCHURE")
    public class HistoBrochure {
     
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column(name="ID_HISTO_BROCHURE")
    	private Long id;
     
    	@ManyToOne
    	@JoinColumn(name="ID_BROCHURE")
    	private Brochure brochure;
     
    	@Column(name="ID_STATUT")
    	private short idStatut;
     
     
    	public Long getId() {
    		return id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}
     
     
     
    	public Brochure getBrochure() {
    		return brochure;
    	}
     
    	public void setBrochure(Brochure brochure) {
    		this.brochure = brochure;
    	}
     
    	public short getIdStatut() {
    		return idStatut;
    	}
     
    	public void setIdStatut(short idStatut) {
    		this.idStatut = idStatut;
    	}
    }
    L'idée est de récuperer une liste d'objets Brochure avec toutes les 3 propriétés id, auteur et surtout statutId (Transient). J'ai essayé avec la classe Criteria mais je n'ai pas réussi. J'essaie de la faire marcher avec HQL mais je bute encore à des erreurs.
    Voici ce que j'ai écris dans ma classe DAO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String SQL= "SELECT  B.ID_BROCHURE, H.ID_STATUT , B.AUTEUR  FROM OCC_TREF_BROCHURE B INNER JOIN OCC_TREF_HISTO_BROCHURE H ON B.ID_BROCHURE =H.ID_BROCHURE";
    		List<Brochure> brochuresList = (List<Brochure>) session.createSQLQuery(SQL).setResultTransformer(Transformers.aliasToBean(Brochure.class)).list();
    Seulement à l'exécution de code, j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    15:01:15,384 ERROR [STDERR] org.hibernate.PropertyNotFoundException: Could not find setter for LIBC_BROCHURE on class fr.si2m.occ.dao.model.Brochure
    	at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
    	at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:57)
    	at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:69)
    	at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:330)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
    	at org.hibernate.loader.Loader.list(Loader.java:2023)
    	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    	at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
    	at fr.si2m.occ.dao.impl.BrochureDAOImpl.getBrochures(BrochureDAOImpl.java:106)
    	at fr.si2m.occ.web.actions.json.SearchBrochuresAction.execute(SearchBrochuresAction.java:77)
    Je comprends que Hibernate considère les noms de colonnes comme nom de propriétés. C'est pour cela qu'il cherche les setters afin de renseigner les attributs de mon objet.
    Ma question est de savoir comment spécifier à Hibernate la correspondance entre noms des colonnes de la table et noms des attributs de mon Objet Brochure ?
    Merci pour votre aide.

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Je suis très loin d'être experte mais je penses que tu devrais faire ta requête en HQL. La correspondance serait faite automatiquement.

    Pour revenir à ta requête, tu lui donnes une requête où tu récupère un LIBC_BROCHURE mais je vois nulle part dans ta classe ni de @Column(name="LIBC_BROCHURE") ni d'attribut correspondant.

    Du coup tu lui dis de transformer ta requête en ta classe brochure mais la requete contient des informations qu'il n'y a pas dans ta classe du coup, il te met une exception.

    Tu lui dis "Transformers.aliasToBean(Brochure.class)" sauf que ta requête a une jointure, du coup j'ai du mal à imaginer qu'il puisse la formater en "Brochure"

    "Ma question est de savoir comment spécifier à Hibernate la correspondance entre noms des colonnes de la table et noms des attributs de mon Objet Brochure ?"
    il me semble qu'il faut mettre @Column(name="nom_de_la_colonne") au dessus de ton attribut ou au dessus du getter.

    Bon courrage

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Points : 261
    Points
    261
    Par défaut
    Tout d'abord merci de m'avoir répondu
    Citation Envoyé par yukiko Voir le message
    Bonjour,
    Je suis très loin d'être experte mais je penses que tu devrais faire ta requête en HQL. La correspondance serait faite automatiquement.
    Je suis d'accord avec toi que HQL me ramène l'objet entier avec la correspondante entre les champs sauvegardés en base et les attributs de mon objet. je dis bien les champs sauvegardés ! Comment ferais-je pour récupérer le champ statutId de l'entité Brochure qui est lui Transient ? C'est ça mon problème! Avec une requête de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from Brochure ....inner join
    Je vais récupérer mon objet tel qu'il est en base donc sans le champ statutId.
    Citation Envoyé par yukiko Voir le message
    Pour revenir à ta requête, tu lui donnes une requête où tu récupère un LIBC_BROCHURE mais je vois nulle part dans ta classe ni de @Column(name="LIBC_BROCHURE") ni d'attribut correspondant.
    Du coup tu lui dis de transformer ta requête en ta classe brochure mais la requete contient des informations qu'il n'y a pas dans ta classe du coup, il te met une exception.

    Tu lui dis "Transformers.aliasToBean(Brochure.class)" sauf que ta requête a une jointure, du coup j'ai du mal à imaginer qu'il puisse la formater en "Brochure"

    "Ma question est de savoir comment spécifier à Hibernate la correspondance entre noms des colonnes de la table et noms des attributs de mon Objet Brochure ?"
    il me semble qu'il faut mettre @Column(name="nom_de_la_colonne") au dessus de ton attribut ou au dessus du getter.
    Je viens de corriger la requête de mon précédent post ! Vu que je n'ai copié que quelques champs de mes classes pour rendre le code lisible, j'avais oublié de modifier ma requête en conséquence.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pracede2005 Voir le message
    Tout d'abord merci de m'avoir répondu

    Je suis d'accord avec toi que HQL me ramène l'objet entier avec la correspondante entre les champs sauvegardés en base et les attributs de mon objet. je dis bien les champs sauvegardés ! Comment ferais-je pour récupérer le champ statutId de l'entité Brochure qui est lui Transient ? C'est ça mon problème! Avec une requête de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from Brochure ....inner join
    Je vais récupérer mon objet tel qu'il est en base donc sans le champ statutId.
    Arf oui je n'avais pas vu et pas bien compris la question.

    Citation Envoyé par pracede2005 Voir le message
    Je viens de corriger la requête de mon précédent post ! Vu que je n'ai copié que quelques champs de mes classes pour rendre le code lisible, j'avais oublié de modifier ma requête en conséquence.
    Ok merci.

    Par contre je n'ai jamais utilisé les @Transient du coup je vais surement dire une bétise, mais le transformer n'utilise-t-il pas les même annotations ? Dans ce cas il ne risque pas d'ignorer l'attribut transient lui aussi ?

    Après c'est beaucoup moins propre je te l'accorde mais en attendant une autre solution tu as toujours la possibilité de récupérer ta liste d'Histo et de créer ta liste de Brochures en parcourant celle d'histo et en settant l'id.

    Bon courrage dans ta recherche désolée de ne pouvoir t'aider plus

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Points : 261
    Points
    261
    Par défaut
    Citation Envoyé par yukiko Voir le message
    Après c'est beaucoup moins propre je te l'accorde mais en attendant une autre solution tu as toujours la possibilité de récupérer ta liste d'Histo et de créer ta liste de Brochures en parcourant celle d'histo et en settant l'id.

    Bon courrage dans ta recherche désolée de ne pouvoir t'aider plus
    Oui c'est une façon de faire comme tu l'as bien dit, ce n'est pas propre de faire comme tu proposes.

    Citation Envoyé par yukiko Voir le message
    Par contre je n'ai jamais utilisé les @Transient du coup je vais surement dire une bétise, mais le transformer n'utilise-t-il pas les même annotations ? Dans ce cas il ne risque pas d'ignorer l'attribut transient lui aussi ?
    Visiblement, le transformer n'utilise pas les annotations qui sont dans les entités (entity). Parce qu'il n'arrive pas nativement à faire correspondre les noms des colonnes à ceux des attributs.

    Ouf ! J'ai finalement trouvé la solution. Il faut utiliser la méthode addScalar de SQLQuery pour lui indiquer que les alias ainsi que leurs types. Ainsi le Transformers peut faire une correspondance entre les colonnes, alias et attributes tout en choisissant les types correspondants. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String SQL= "SELECT B.ID_BROCHURE as id,H.ID_STATUT as statutId, B.AUTEUR as auteur FROM BROCHURE as B INNER JOIN HISTO_BROCHURE as H ON B.ID_BROCHURE =H.ID_BROCHURE";
    		SQLQuery sqlQuery = session.createSQLQuery(SQL);
    		sqlQuery.addScalar("id", Hibernate.INTEGER);
    		sqlQuery.addScalar("statutId",Hibernate.INTEGER);
    		sqlQuery.addScalar("auteur",Hibernate.STRING);
     
    		List<Brochure> brochuresList = (List<Brochure>) sqlQuery.setResultTransformer(Transformers.aliasToBean(Brochure.class)).list();
    Pour ceux qui auront le même problème que moi.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/12/2014, 08h47
  2. Réponses: 1
    Dernier message: 30/09/2008, 17h13
  3. SQL Query. Récupérer une valeur
    Par James64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2005, 14h15
  4. Utilisation de l'apostrophe en SQL QUERY
    Par joshua.shamael dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 28/04/2005, 17h53
  5. Recherche Data pour m'exercer en SQL-Query
    Par Oneill dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 13/10/2004, 11h43

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