2009-06-01 14 views
1

J'ai une propriété dans mon fichier de mappage XML commeUtilisation de projections sur les propriétés de Formule

<property name="CreatedByLogin" formula="(select x.fst_name || ' ' || x.last_name from sebl_dev.S_CONTACT x where x.ROW_ID=CREATED_BY)" type="String" /> 

et je veux utiliser une projection sur ce nom particulier comme

.Add(Projections.Property("CreatedByLogin"), "CreatedByLogin") 

et je reçois exception Oracle .

Existe-t-il un moyen de faire une projection sur une propriété déclarée à l'aide d'une formule?

My SQL généré est

select 
    * 
from (
    SELECT 
     this_.ROW_ID as y0_, 
     this_.CREATED as y1_, 
     this_.CREATED_BY as y2_, 
     this_.STATUS as y3_, 
     this_.PSR_NUM as y4_, 
     this_.ORDER_ID as y5_, 
     this_.WFM_ID as y6_, 
     this_.VIRTUAL_SS_ID as y7_, 
     this_.VERIFIED_WITH as y8_, 
     this_.REQ_DUE_DATE as y9_, 
     this_.TYPE as y10_, 
     account1_.NAME as y11_, 
     account1_.OU_NUM as y12_, 
     this_.DESCRIPTION as y13_, 
     account1_.MARKET_TYPE_CD as y14_, 
     account1_.X_SALES_CHANNEL as y15_, 
     this_.QUOTE_ID as y16_, 
     (
      select 
       x.fst_name || ' ' || x.last_name 
      from sebl_dev.S_CONTACT x 
      where x.ROW_ID=this_.CREATED_BY) 
     as y17_, 
     (
      select 
       x.fst_name || ' ' || x.last_name 
      from sebl_dev.S_CONTACT x 
      where x.ROW_ID=this_.LAST_UPD_BY) 
     as y18_, 
     serviceacc2_.INTEGRATION_ID as y19_, 
     serviceacc2_.NAME as y20_, 
     accountadd3_.ADDR as y21_, 
     accountadd3_.ADDR_LINE_2 as y22_, 
     accountadd3_.CITY as y23_, 
     accountadd3_.STATE as y24_, 
     accountadd3_.ZIPCODE as y25_ 
     FROM XOOE.XO_SS_HEADER this_ 
inner join XOOE.XO_SS_DETAILS this_1_ 
on this_.ROW_ID=this_1_.ROW_ID 
inner join sebl_dev.S_ORG_EXT account1_ 
on this_.CUST_ACCNT_ID=account1_.ROW_ID 
left outer join sebl_dev.S_org_ext_x account1_1_ 
on account1_.ROW_ID=account1_1_.Row_id 
left outer join sebl_dev.S_ORG_EXT_UTX account1_2_ 
on account1_.ROW_ID=account1_2_.PAR_ROW_ID 
inner join sebl_dev.S_ORG_EXT serviceacc2_ on this_.SERV_ACCNT_ID=serviceacc2_.ROW_ID 
left outer join sebl_dev.S_org_ext_x serviceacc2_1_ 
on serviceacc2_.ROW_ID=serviceacc2_1_.Row_id 
left outer join sebl_dev.S_ORG_EXT_UTX serviceacc2_2_ 
on serviceacc2_.ROW_ID=serviceacc2_2_.PAR_ROW_ID 
inner join sebl_dev.S_ADDR_PER accountadd3_ 
on serviceacc2_.PR_ADDR_ID=accountadd3_.ROW_ID 
     WHERE this_.TYPE = :p0) 

    where rownum <= :p1 

et l'exception résultant est

InnerException {"ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table"} System.Exception {Oracle.DataAccess.Client.OracleException} 

Répondre

0

Ma meilleure estimation:

vous sélectionnez une clé d'une table qui ne touche pas définie dessus. Vous allez devoir déterminer quelle table il est et ajouter le champ de clé primaire.

0

Ceci est un bogue connu dans les versions Oracle 9, 10 et antérieures de 11. Il est apparemment corrigé dans la dernière version.

Le problème est dû à un bogue dans la manière dont ces anciennes versions traitent les jointures de style SQL-92. Donc, s'il n'est pas possible de mettre à niveau, vous pouvez contourner le problème en utilisant des jointures SQL-89 de style ancien. Par exemple, un INNER JOIN:

SELECT column 
FROM table1 t1, table2 t2 
WHERE t1.pk = t2.fk 

Un autre exemple, cette fois pour LEFT JOIN:

SELECT column 
FROM table1 t1, table2 t2 
WHERE t1.pk = t2.fk(+) 

Plus d'infos:

http://awads.net/wp/2007/06/14/when-ansi-sql-join-syntax-does-not-work-in-oracle/