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 :

Jointure sur clé composée


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut Jointure sur clé composée
    Hello,

    J'ai un mapping avec une clé composée, dont certains éléments pointent vers d'autres tables.

    Côté DAO, je souhaite requéter via Criteria, mais les jointures qui fonctionnent sur les mapping classique, sans clé composée, ne marchent plus ici ; la jointure ne se fait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <class name="com.xxx.CimValue"
    		table="TOTO"
    		dynamic-update="true">
     
    	<composite-id name="id" class="com.xxx.CimValuePK">
    	    	<key-many-to-one name="cim" column="ID_CIM" class="com.xxx.Cim"/>
    	    	<key-many-to-one name="refset" column="ID_SET" class="com.xxx.CommonSet"/>
    	    	<key-many-to-one name="source" column="ID_SOURCE" class="com.xxx.RateSourceCmn"/>
    	    	<key-property name="economicalDate" column="ECO_DATE" type="java.util.Date" />
    	    	<key-property name="deletionDatetime" column="DELETION_DATETIME" type="java.util.Date"/>
            </composite-id>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Criteria criteria = getSession().createCriteria(CimValue.class)
    				.createAlias("id.refset", "refset", Criteria.INNER_JOIN)
    				.add(Restrictions.eq("id.economicalDate",ecoDate))
    				.add(Restrictions.eq("refset.id", refset))
    				;
    			List<CimValue> result = criteria.list();
    			return result;
    Le problème intervient à l'exécution où j'obtiens une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00904: "REFSET1_"."ID": invalid identifier
    L'origine étant la requête générée par hibernate, qui n'a pas fait de jointure avec la table de l'object REFSET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select this_.ID_CIM as ID1_18_0_, 
    this_.ID_SET as ID2_18_0_, 
    this_.ECO_DATE as ECO4_18_0_, 
    this_.DELETION_DATETIME as DELETION5_18_0_, 
    this_.ID_CHARAC as ID6_18_0_, 
    [...] 
    from TOTO this_ 
    where refset1_.ID=? 
    and this_.ECO_DATE=?
    J'ai testé, retesté, re-vérifié, rien n'y fait. Est-ce que quelqu'un voit le problème et surtout sa raison ?
    abertaud
    ---------

    - pas de réponse technique en PV, utilisez les forums
    - si vous trouvez seuls la solution, n'abandonnez pas votre post, mettez-le à jour pour les autres
    - le tag est parfois en voie d'extinction, participez à sa survie

  2. #2
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    Personne n'a d'avis sur la question ?
    abertaud
    ---------

    - pas de réponse technique en PV, utilisez les forums
    - si vous trouvez seuls la solution, n'abandonnez pas votre post, mettez-le à jour pour les autres
    - le tag est parfois en voie d'extinction, participez à sa survie

  3. #3
    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
    Je me souviens avoir galéré sur des Criteria avec clés composées - et sans succès car c'était un problème connu et identifié de Hibernate. Par contre, j'avais vu qu'une version plus récente résolvait le problème (sauf qu'on m'avait demandé de ne pas changer la version de Hibernate par peur des régressions, donc j'avais contourné en faisant du HQL / SQL).
    Quelle version de hibernate utilise-tu ?

  4. #4
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    Ce serait une version 3.2.5
    abertaud
    ---------

    - pas de réponse technique en PV, utilisez les forums
    - si vous trouvez seuls la solution, n'abandonnez pas votre post, mettez-le à jour pour les autres
    - le tag est parfois en voie d'extinction, participez à sa survie

  5. #5
    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
    Ah oui, je pensais à une version plus ancienne.

    Tu as essayé de décomposer un peu plus ? À quoi ressemble ta classe CommonSet ?

  6. #6
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    Qu'entends-tu par décomposer un peu plus ? S'il s'agit du modèle de donnée, il n'est pas modifiable.

    CommonSet de son côté est relativement simple : un id technique, un nom, une date de fin de validité, et deux trois autres bricoles, mais rien de bien méchant
    abertaud
    ---------

    - pas de réponse technique en PV, utilisez les forums
    - si vous trouvez seuls la solution, n'abandonnez pas votre post, mettez-le à jour pour les autres
    - le tag est parfois en voie d'extinction, participez à sa survie

  7. #7
    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
    J'entendais essentiellement mettre un alias en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Criteria criteria = getSession().createCriteria(CimValue.class)
    				.createAlias("id", "id1", Criteria.INNER_JOIN)
    				.createAlias("id1.refset", "refset", Criteria.INNER_JOIN)
    				.add(Restrictions.eq("id1.economicalDate",ecoDate))
    				.add(Restrictions.eq("refset.id", refset))
    				;

  8. #8
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    C'est le même résultat : toujours pas de jointure dans le code SQL généré
    abertaud
    ---------

    - pas de réponse technique en PV, utilisez les forums
    - si vous trouvez seuls la solution, n'abandonnez pas votre post, mettez-le à jour pour les autres
    - le tag est parfois en voie d'extinction, participez à sa survie

Discussions similaires

  1. Jointure sur une clé composée
    Par HadanMarv dans le forum JPA
    Réponses: 3
    Dernier message: 06/12/2012, 17h43
  2. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08
  3. [C#] OnPaint(PaintEventArgs e) sur création Composant
    Par pc152 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/08/2004, 16h13
  4. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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