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 :

Requete HQL hibernate


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut Requete HQL hibernate
    Bonjour,

    mon problème est le suivant :


    je dispose d'une classe :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
     
    package fr.uma.modele;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.DiscriminatorColumn;
    import javax.persistence.DiscriminatorType;
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Inheritance;
    import javax.persistence.InheritanceType;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.CascadeType;
    import javax.persistence.SequenceGenerator;
     
    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="categorieType", discriminatorType=DiscriminatorType.STRING)
    @DiscriminatorValue("Categorie")
    @SequenceGenerator(name = "SEQ_CATEGORIE", sequenceName = "SEQ_CATEGORIE")
    /**
     * Une categorie est la classe mère qui permet de représenter :
     * - les raisons de lancement d'un produit
     * - les caractéristiques d'un produit
     * - les bénéfices du produit
     * La propriété "listeChoix" est une liste contenant les choix sélectionnés 
     * pour une caractéristique/raison/bénéfice donnée.
     * 
     */
    public class Categorie implements Serializable{
     
    	private static final long serialVersionUID = -8943190352045480541L;
     
    	private Long id; 
    	private CategorieType type = null;
    	private List<String> listeChoix = new ArrayList<String>();	
    	private Produit produit;
     
    	public Categorie(){}
     
    	public Categorie(Produit p, CategorieType type)
    	{
    		this.type = type;
    		this.produit = p;
    	}
     
    	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "SEQ_CATEGORIE")
    	public Long getId() {
    		return id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}	
     
    	@OneToMany(cascade=CascadeType.ALL)
    	public List<String> getListeChoix() {
    		return listeChoix;
    	}
     
    	public void setListeChoix(List<String> listeChoix) {
    		this.listeChoix = listeChoix;
    	}
     
    	@Column(nullable=false)
    	public CategorieType getType() {
    		return type;
    	}
     
    	public void setType(CategorieType type) {
    		this.type = type;
    	}
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	public Produit getProduit() {
    		return produit;
    	}
     
    	public void setProduit(Produit produit) {
    		this.produit = produit;
    	}
     
     
    }
    En particulier, cette classe dispose d'une propriété : "listeChoix" qui est une liste de String.

    D'habitude on a une liste d'objet d'une classe qu'on doit mapper également. Or là j'ai un type String, donc je n'est pas eu besoin de mapper ... la classe "String" quoi. Ce qui fait que jobtiens les tables suivantes dans la BD :


    la table CATEGORIE avec les colonnes
    - Categorietype
    - id
    - type
    - autre
    - id_produit

    et il m'a crée automatiquement une table CATEGORIE_LISTECHOIX avec les colonnes :

    categorie_id (clé etrangère qui est une référence à l'id d'une categorie)
    element (qui est un varchar, c'est un string qu'on retrouve dans une listeChoix)


    Mon problème/question est :

    quelle requête HQL hibernate effectuer pour récupérer les categories dont listeChoix contient une String "str1" par exemple.

    Je suis allé par petit pas, j'ai essayé la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ejbql = "from Categorie c"
    , ça marche

    puis une simple jointure sans condition , inutile quoi, mais juste pour le test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ejbql="from Categorie c join c.listeChoix CatlistChoix";
    ça marche

    puis avec une condition :

    String ejbql="from Categorie c join c.listeChoix CatlistChoix where CatlistChoix.element = str1";

    là il me met une magnifique exception :

    Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.QueryException: cannot dereference scalar collection element: element [from fr.uma.modele.Categorie c join c.listeChoix CatlistChoix where CatlistChoix.element = str1]
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:560)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:79)
    at fr.uma.utils.Test.requete(Test.java:56)
    at fr.uma.utils.Test.main(Test.java:103)
    Caused by: org.hibernate.QueryException: cannot dereference scalar collection element: element [from fr.uma.modele.Categorie c join c.listeChoix CatlistChoix where CatlistChoix.element like nimporte_quoi_comme_chaine]
    at org.hibernate.persister.collection.ElementPropertyMapping.toType(ElementPropertyMapping.java:33)
    at org.hibernate.persister.collection.AbstractCollectionPersister.toType(AbstractCollectionPersister.java:1255)
    at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:280)
    at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:373)
    at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:539)
    at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:221)
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:172)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:732)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1215)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4032)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3662)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1758)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:227)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:159)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:110)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1586)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:76)
    ... 2 more


    J'ai fais des recherches, je suis tombé sur une page qui correspond à l'erreur :

    http://www.koders.com/java/fidDDD526...580602384.aspx

    mais bon ça ne m'enchante pas trop .

    Quelqu'un saurait-il comment faut s'y prendre pour ma requête en question?

    Merci d'avance.

  2. #2
    zev
    zev est déconnecté
    Membre actif
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Points : 220
    Points
    220
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ejbql="from Categorie c where c.listeChoix.element = 'str1'";
    ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé de ta manière , ça me met aussi la même erreur.

    Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.QueryException: cannot dereference scalar collection element: element [from fr.uma.modele.Categorie as c where c.listeChoix.element = 'str1']
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:560)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:79)
    at fr.uma.utils.Test.requete(Test.java:56)
    at fr.uma.utils.Test.main(Test.java:100) ..etc
    En fait je crois qu'il aime pas les list de String(type primitif donc..)

    En gros, j'ai un objet :

    Produit {

    @OneToOne
    Categorie catg;

    }

    et

    Categorie {

    @ManyToOne
    List<String> listeChoix;

    }

    Au pire, je comptais récupéré les produits dont la catégorie possède tel ou tel choix dans sa liste de choix.

    Et je voulais oublier les produits, pour commencer simple et récupérer les catégories qui possède tel ou tel choix.

    A priori, je ne trouve pas d'autre solution que de changer mon modèle .
    Au pire, je pourrais faire une List<Item> :

    La classe Categorie deviendrait :

    Categorie {

    @ManyToOne
    List<Item> listeChoix;

    }

    et Item une classe qui symbolisera la String ....... :

    Item {

    String choix

    }

    Pas encore tester, mais comme Item n'est plus un type primitif, cela marchera je pense, qu'en pensez vous? ....

  4. #4
    zev
    zev est déconnecté
    Membre actif
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Points : 220
    Points
    220
    Par défaut
    c une base sql ?
    si oui, tu as quelle version de mysql connector ?
    j'ai eu des gros pb de jointure avec 3.1.12, donc j'ai rétabli la 3.1.10. et tout marche bien.

  5. #5
    Membre confirmé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par DanZzz
    En fait je crois qu'il aime pas les list de String(type primitif donc..)

    String n'est pas un type primitif !!!
    C'est une classe pure et dure !!!

    Ton problème vient d'ailleur c'est sur !

    Je serais toi je me retournerai vers la doc de référence de Hibernate plutot très bien fournit en HQL (sur le site officiel de hibernate)
    Juvamine

Discussions similaires

  1. Hibernate requete HQL et Objet date "complexe"
    Par Esil2008 dans le forum Hibernate
    Réponses: 0
    Dernier message: 21/07/2009, 11h40
  2. [Hibernate] problème requete HQL !
    Par fadjerx dans le forum Hibernate
    Réponses: 6
    Dernier message: 11/08/2007, 12h45
  3. executer une requete hql
    Par oasma dans le forum Hibernate
    Réponses: 1
    Dernier message: 13/05/2007, 08h54
  4. Réponses: 8
    Dernier message: 27/04/2007, 10h47
  5. Requete HQL avec jointure
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 50
    Dernier message: 24/04/2007, 15h54

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