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 :

Problème de requête en Criteria sur jointure


Sujet :

Hibernate Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 706
    Points : 934
    Points
    934
    Par défaut 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 : 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 !!

    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é !!
    Voici mon code

    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 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
    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 : 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;
        }
     
    }
    Notation UML
    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

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Il me semble qu'il te manque un alias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Criteria crit4 = ((Session) getEntityManager().getDeplaceate()).createCriteria(DatedLocation.class);
    crit4.createAlias("id","idAlias");
    crit4.setFetchMode("id.datedrule", FetchMode.JOIN);
    crit4.createAlias("idAlias.datedrule", "dfr");
    //Mono places
    crit4.add(Restrictions.eq("dfr.nbPlaces",new Integer(1)));
    List<DatedLocation> z4a=crit4.list();

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 706
    Points : 934
    Points
    934
    Par défaut
    Bonsoir,

    Non cela ne fonctionne pas j'ai le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Column not found: DFR2_.NB_PLACES in statement .... from yo_dtdrules this_ where dfr2_.nb_places=?]

Discussions similaires

  1. [AC-2013] Problème multiple requêtes d'ajouts sur unique table
    Par francoisem dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/12/2014, 08h32
  2. Réponses: 4
    Dernier message: 06/11/2014, 18h39
  3. Réponses: 4
    Dernier message: 26/04/2006, 14h02
  4. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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