2009-06-01 3 views
1

나는사용 계획은

<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" /> 

처럼 내 XML 매핑 파일의 속성을하고 난

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

처럼이 특정 이름을 투사를 사용하려면 내가 오라클 예외를받을 수 있나요 .

수식을 사용하여 선언 된 속성에 투영을 수행하는 방법이 있습니까?

내 생성 된 SQL은

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 

하고 결과 예외는

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

답변

0

내 추측 :

당신은 키가 정의되어 있지 않은 테이블에서 키를 선택하는 그 위에. 어떤 테이블인지 파악하고 기본 키 필드를 추가해야합니다.

0

이것은 Oracle 9, 10 및 11 이전 버전의 알려진 버그입니다. 이것은 분명히 최신 버전으로 수정되었습니다.

이 문제는 이전 버전에서 SQL-92 스타일 조인을 처리하는 방식의 버그로 인해 발생합니다. 따라서 업그레이드가 불가능한 경우 이전 스타일의 SQL-89 조인을 사용하여 문제를 해결할 수 있습니다. 예를 들어, 내부 조인 :

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

또 다른 예를 들어, 왼쪽이 시간이 가입 :

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

상세 정보 :

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