Bonsoir
J'ai un soucis de requete en Criteria
J'ai trois Classes Entity
DatedLocation, DatedLocationId, Datedrule
Datedrule contient un entier nbplaces,
je souhaite selectionner uniquement les DatedLocation dont la Datedrule a un nombre de place a 1
En HQL cela fonctionn et donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 List<DatedLocation> result = new ArrayList<DatedLocation>(); StringBuffer whereClause = new StringBuffer("where "); whereClause.append(" df.id.datedrule.nbPlaces = 1"); Query query = getEntityManager().createQuery("from DatedLocation as df " + whereClause); result = query.getResultList();
MAIS En CRITERIA cela ne fonctionne pas !!
Voici mon code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Criteria crit4 = ((Session) getEntityManager().getDeplaceate()).createCriteria(DatedLocation.class); crit4.setFetchMode("id.datedrule", FetchMode.JOIN); crit4.createAlias("id.datedrule", "dfr"); //Mono places crit4.add(Restrictions.eq("dfr.nbPlaces",new Integer(1))); List<DatedLocation> z4a=crit4.list(); Le champ nbplaces n'est pas trouvé !!
La classe embedded incluse dans celle ci dessus
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 import java.io.Serializable; import java.util.Set; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.builder.ToStringBuilder; @Entity @Table(name="YO_DTDLOCATIONS") public class DatedLocation implements Serializable { /** the class id*/ @EmbeddedId private DatedLocationId id; }
La classe qui contient le nombre de places nbPlaces
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 import java.io.Serializable; import javax.persistence.Embeddable; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Transient; import org.apache.commons.lang.builder.ToStringBuilder; import org.hibernate.annotations.ForeignKey; @Embeddable public class DatedLocationId implements Serializable { public DatedLocationId() { } /** Attribute*/ @ManyToOne() @JoinColumn(name="DTDRTE", nullable=false) @ForeignKey(name = "FK_YO_DTDLOCATIONS_DTDRTE") private Datedrule datedrule; //La classe qui contient nbPlaces }
Notation UML
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 @Entity @Table(name="YO_DTDRULES") @SequenceGenerator( name="YO_DTDRULE_ID", sequenceName="YO_DTDRULE_ID" public class Datedrule implements Serializable { /** * id */ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="YO_DTDRULE_ID") @Column(name="ID") private Long id; /** * nbplaces */ private Integer nbPlaces; public Integer getNbPlaces() { return this.nbPlaces; } public void setNbOlaces(Integer pPlaces) { this.nbPlaces = pNbPlaces; } }
DatedLocation *----1 DatedRule
Par contre la requete simple mono-table fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //OK fonctionne Criteria crit2 = ((Session) getEntityManager().getDelegate()).createCriteria(DatedRule.class); crit2.add(Restrictions.eq("nbPlaces",new Integer(1))); List<DatedRule> xx= crit2.list();
J'utilise DBUNIT pour faire mes tests, et ma base de donnée finale sera Oracle10
Ou est mon erreur ?
Merci d'avance
Phil
Partager