-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: <sql-query>: Problème de Nom de colonne non valide
PostPosted: Tue Dec 14, 2010 7:35 am 
Beginner
Beginner

Joined: Fri May 13, 2005 9:39 am
Posts: 21
Bonjour,
Depuis plusieurs jours, je tourne en rond sur une requète en sql natif à mapper via Hibernate.
Pour décrire le sujet, je dois récupérer la dernière version d'un workflow qui a été validé (en dehors de mon appli) pour référencer son utilisation dans des usines (les personnes en usines doivent décrire leur utilisation de l'exemple validé).
Voici la description simplifiée du problème:
  • Les données à récupérer pour le mapping se trouvent dans une base sur laquelle je ne dispose que de droits d'écriture (pas de création de vues possible, schéma subit non modifiable)
  • Les tables sont les suivantes:
    • Workflow(ID, OWNERID, STATUS): Enregistrement maître. La table possède d'autres colonnes dont je n'ai pas besoin
    • Version (ID, VERSIONNUM, TITLE): Enregistrement faisant référence à la table Workflow par la colonne ID et à la table personne par la colonne OWNERID. La table possède d'autres colonnes dont je n'ai pas besoin
    • STUDY(ID, VALIDATOR, AVIS, INFOS): Enregistrement faisant référence à la table Workflow par la colonne ID et à la table personne par la colonne VALIDATOR. La colonne INFOS est en fait une simplification des 15 autres colonnes que je mappe.
    • PERSONNE (ID, LOGIN, LASTNAME, FIRSTNAME, MAILADDRESS): la table personne possède d'autres colonnes dont je n'ai pas besoin
  • Les mappings sont les suivants:
    • PERSONNE:
      Code:
      <hibernate-mapping>
          <class name="com.mkt.model.Person" table="PERSONNE" mutable="false">
              <id name="id" type="java.lang.Long">
                  <column name="ID" precision="22" scale="0" not-null="true" />
                  <generator class="assigned"/>
              </id>
              <property name="login" type="java.lang.String" column="LOGIN"/>
              <property name="lastName" type="java.lang.String">
                  <column name="LASTNAME" not-null="true" />
              </property>
              <property name="firstName" type="java.lang.String">
                  <column name="FIRSTNAME" not-null="true" />
              </property>
              <property name="mail" type="java.lang.String">
                  <column name="MAILADDRESS" not-null="true" />
              </property>
          </class>
      </hibernate-mapping>
    • STUDY: les données d'une étude étant stockées dans plusieurs tables, je n'ai pas préciser de table dans le mapping
      Code:
      <hibernate-mapping>
         <class name="com.mkt.model.Study" mutable="false">
            <id name="id" type="java.lang.Long" column="ID">
               <generator class="assigned" />
            </id>
            <property name="title" type="java.lang.String" column="TITLE"/>
            <many-to-one name="initiator" class="com.mkt.model.Person" fetch="join" column="OWNERID"/>
            <many-to-one name="localValidator" class="com.mkt.model.Person" fetch="join" column="VALIDATOR"/>
            <property name="infos" type="java.lang.String" column="INFOS"/>
         </class>
      </hibernate-mapping>
  • Pour récupérer les données validées, j'ai construit une requète SQL qui va rechercher les bonnes données et l'ai placée dans à la suite du mapping:
    Code:
       <sql-query name="loadStudy">
          <return alias="study" class="com.mkt.model.Study" />
          <return-join property="study.initiator" alias="initiator"/>
          <return-join property="study.localValidator" alias="localValidator"/>
          <![CDATA[
          select a.ID {study.id},
             g.TITLE {study.title},
             a.INFOS {study.infos},
             f.ownerid {initiator.livelinkId},
             initiator.login {initiator.sgi},
             initiator.lastName {initiator.lastName},
             initiator.firstName {initiator.firstName},
             initiator.mailaddress {initiator.mail},
             a.VALIDATOR {localValidator.livelinkId},
             localValidator.login {localValidator.sgi},
             localValidator.lastName {localValidator.lastName},
             localValidator.firstName {localValidator.firstName},
             localValidator.mailaddress {localValidator.mail}
          from STUDY a
             inner join workflow f
                on a.id = f.id and validation = 'Accepted' and f.STATUS='Completed'
             inner join Version g
                on a.id = g.id
             inner join personne initiator
                on f.ownerid = initiator.id
             inner join personne localValidator
                on a.VALIDATOR = localValidator.id
          where g.versionnum = (select
             min(versionnum) from VERSION b where b.id = a.id)
          order by id desc
          ]]>
       </sql-query>
Lorsque j'appelle ma requète, le système me retourne une erreur SQL "Nom de colonne non valide" qui est dûe au fait que la transformation qu'effectue hibernate renomme les colonnes et essaie d'appeler une colonne qui n'est pas retournée:
La requète envoyée en JDBC est la suivante:
Code:
select a.id ID19_0_,
   g.title TITLE19_0_,
   a.INFOS SPECIFIC19_0_,
   f.ownerid ID18_1_,
   initiator.name NAME18_1_,
   initiator.lastName LASTNAME18_1_,
   initiator.firstName FIRSTNAME18_1_,
   initiator.mailaddress MAILADDR5_18_1_,
   a.VALIDATOR ID18_2_,
   localValidator.name NAME18_2_,
   localValidator.lastName LASTNAME18_2_,
   localValidator.firstName FIRSTNAME18_2_,
   localValidator.mailaddress MAILADDR5_18_2_
from STUDY a
inner join workflow f
   on a.id = f.id and validation = 'Accepted' and f.STATUS='Completed'
inner join Version g
   on a.id = g.id
inner join personne initiator
   on f.ownerid = initiator.id
inner join personne localValidator
   on a.VALIDATOR = localValidator.id
where g.versionnum = (select min(versionnum) from VERSION b where b.id = a.id)
order by id desc

et Hibernate demande la colonne owne5_19_0_ au JDBC d'où l'erreur nom de colonne non valide.

Auriez-vous une idée car ni la doc, ni des sujets sur les fora pour des problèmes similaires (même exception levée) ne m'ont apporté de réponse ?

Merci

XOrangoutan


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.