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 :

HQL avec critère


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Par défaut HQL avec critère
    Bonjour,

    Je désire effectué une requête sur deux tables qui ont une relation many-to-many avec un critère de selection sur chaque table. le mapping des tables est le suivant:

    Team.hbm.xml:
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name="com.yannick.lombard.gwt.client.model.Team" table="TEAMS">
            <id name="id" type="int" column="ID">
                <generator class="increment"/>
            </id>
            <property name="teamName" type="string">
                <column name="TEAM_NAME"  not-null="true" />
            </property>
            <property name="teamTown" type="string">
                <column name="TEAM_TOWN"  not-null="true" />
            </property>
            <property name="teamAbbrev" type="string">
                <column name="TEAM_ABBREV"  not-null="true" />
            </property>
            <property name="teamStadiumName" type="string">
                <column name="TEAM_STADIUM_NAME"  not-null="true" />
            </property>
            <property name="teamFoundationYear" type="string">
                <column name="TEAM_FOUNDATION_YEAR"  not-null="false" />
            </property>
     
            <many-to-one name="country" column="country_id" not-null="false" class="com.yannick.lombard.gwt.client.model.Country" />
     
            <set name="seasons" table="teams_seasons" lazy="false">
          		<key column="team_id"/>
          		<many-to-many class="com.yannick.lombard.gwt.client.model.Season" column="season_id"/>
        	</set>
     
      </class>
    </hibernate-mapping>
    Season.hbm.xml:
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name="com.client.model.Season" table="SEASONS" lazy="false">
      		<id name="id" type="int" column="ID">
          		<generator class="increment"/>
        	</id>
     
        	<property name="seasonYear" type="string">
        		<column name="SEASON_YEAR"  not-null="true" />
            </property>
     
            <set name="teams" table="teams_seasons" lazy="false">
          		<key column="season_id"/>
          		<many-to-many class="com.yannick.lombard.gwt.client.model.Team" column="team_id"/>
        	</set>
      </class>
    </hibernate-mapping>
    Country.hbm.xml:
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name="com.client.model.Country" table="COUNTRIES" lazy="false">
            <id name="id" type="int" column="ID">
                <generator class="increment"/>
            </id>
            <property name="countryName" type="string">
                <column name="COUNTRY_NAME"  not-null="true" />
            </property>
            <property name="countryAbbrev" type="string">
                <column name="COUNTRY_ABBREV"  not-null="true" />
            </property>
      </class>
    </hibernate-mapping>
    Je désire récupérer toute les teams avec un country_id et un season_id.

    J'ai mis une image de la base en pièce jointes.
    Images attachées Images attachées  

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    c'est pas clair au niveau de ta question, tu veux toutes les teams qui ont des infos pour country et season, ou tu veux toutes les teams qui ont un country et une season donnés ?

    dans les 2 cas je te conseille d'utiliser l'api Criteria d'hibernate, ça donnera quelque chose comme ça pour la première option:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Criteria criteria = session.createCriteria(Team.class);
    criteria.add(Restrictions.isNotNull("country"));
    criteria.createCriteria("seasons").add(Restrictions.isNotNull("id"));

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Je vais essayer d'être plus clair.
    Si tu prends l'image de la base que j'ai mis en pièce jointe,
    je voudrais la requête hql ou autre qui répond à cette requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select a.* 
    from teams a, teams_seasons  b, seasons c
    where a.country_id = param1
    and a.id = b.team_id
    and b.season_id = c.id
    and c.id = param2
    Merci

  4. #4
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    dans ce cas c'est la 2e option, donc au choix Criteria
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Criteria criteria = session.createCriteria(Team.class);
    criteria.add(Restrictions.eq("library.id", param1));
    criteria.createCriteria("seasons").add(Restrictions.eq("id", param2));
    en HQL, ça devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "select xs.id
    from Team a
    join a.seasons as b
    where a.country.id = "+param1+"
    and b.id = "+param2
    mais je suis moins à l'aise, j'utilise les Criteria en général. Il doit par exemple y avoir un moyen d'utiliser des requêtes paramétrées avec hql

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Par défaut
    Merci pour tes réponses éclairées qui me font avancer.

    J'ai modifier la requête de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "select distinct team from Team team right outer join team.seasons as season where team.country.id = :countryId";
    Celle ci fonctionne correctement à partir du principe ou il existe au moins une référence pour une équipe dans chaque table.
    Par contre si l'équipe est présente dans la table team et que celle-ci n'a aucune référence dans la table team_season et season celle-ci n'est pas récupérée par la requête.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Par défaut
    J'ai modifié la requête et la ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select distinct team from Team team left outer join team.seasons as season where team.country.id = :countryId;

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/01/2012, 17h59
  2. Requêtes sur enregistrements avec critères dates
    Par Aliveli dans le forum Access
    Réponses: 10
    Dernier message: 05/06/2006, 13h41
  3. Pb requête avec critères dans projet Access
    Par laville dans le forum Access
    Réponses: 4
    Dernier message: 19/04/2006, 20h09
  4. [DOM] Récupération d'un noeud avec critères ?
    Par elitost dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 20/10/2005, 15h27
  5. [Excel] Selection multiple avec critères
    Par tibotibotibo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2005, 10h48

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