Bonjour,
mon problème est le suivant :
je dispose d'une classe :
En particulier, cette classe dispose d'une propriété : "listeChoix" qui est une liste de String.
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; } }
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:
, ça marche
Code : Sélectionner tout - Visualiser dans une fenêtre à part String ejbql = "from Categorie c"
puis une simple jointure sans condition , inutile quoi, mais juste pour le test :
ça marche
Code : Sélectionner tout - Visualiser dans une fenêtre à part String ejbql="from Categorie c join c.listeChoix CatlistChoix";
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.
Partager