Problème de requête en Criteria sur jointure
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:
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 !!
Code:
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é !! |
Voici mon code
Code:
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 embedded incluse dans celle ci dessus
Code:
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
} |
La classe qui contient le nombre de places nbPlaces
Code:
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;
}
} |
Notation UML
DatedLocation *----1 DatedRule
Par contre la requete simple mono-table fonctionne
Code:
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