2012-04-04 64 views
0

這是一個我試圖使用OpenJPA重新創建的oracle查詢。我正在編寫Websphere集成開發人員的服務,並且我使用OpenJPA作爲我選擇的ORM工具。以前,這個查詢是使用存儲過程執行的,使用了一個引用遊標並且像那樣獲取了信息。現在我們正在嘗試使用OpenJPA作爲我們的選擇工具。所以我想,我應該再重建中使用OpenJPA存儲的過程...使用OpenJPA重新創建查詢

SELECT DISTINCT 
    P.col1 as ID, 
    P.col2, 
    P.col3, 
    P.col4, 
    P.col5, 
    S.col6, 
    PC.col7, 
    P.col8, 
    A.ADDRESS_1, 
    A.ADDRESS_2, 
    A.ADDRESS_3, 
    A.CITY, 
    A.COUNTY, 
    A.STATE, 
    A.ZIP_CODE, 
    P.CONFIRMED_BY, 
    P.CONFIRMED_DATE, 
    P.MOD_USERID, 
    P.MOD_DATE 
FROM EPCD13.PROVIDER P, EPCD13.provider_channel PC, EPCD13.provider_channel_link pcl, 
    EPCD13.provider_specialty ps, EPCD13.SPECIALTY S, EPCD13.Address A, EPCD13.ADDRESS_LINK AL 
WHERE P.RESOURCE_ID = personID 
    AND P.RESOURCE_ID = PS.RESOURCE_ID (+) 
    AND 1 = PS.PRIMARY_SPECIALTY_ID (+) 
    AND PS.SPECIALTY_ID = S.SPECIALTY_ID (+) 
    AND P.RESOURCE_ID = PCL.RESOURCE_ID (+) 
    AND PCL.PROVIDER_CHANNEL_ID = PC.PROVIDER_CHANNEL_ID 
    AND 1 = PCL.PREFERENCE (+) 
    AND 9 = pc.channel_type_id (+) 
    AND PC.CHANNEL_ADDRESS NOT LIKE '%@%' 
    AND P.RESOURCE_ID = AL.RESOURCE_ID (+) 
    AND AL.ADDRESS_ID = A.ADDRESS_ID (+) 
    AND 1 = A.ADDRESS_TYPE_ID (+) 
    AND 1 = AL.PREFERENCE (+); 

通知所有的內部連接等等。我現在想把一個命名查詢放在一個我的方法中,它將返回與上面相同的結果。正如你可能會注意到,有多個表被稱爲那裏,並在不同的點加入...我想我可以把這個查詢放入createNamedQuery()函數,只需稍作更改......但我想這裏有必須做一個簡單的方法來做到這一點?也許不會。我可以使用JPA調用存儲過程嗎?

回答

1

因爲你的SQL非常複雜,所以轉換爲JPQL並不容易,我建議保留它。 您可以使用OpenJPA的NativeQuery,它可以執行SQL查詢。如果你的SQL沒有用SELECT啓動,它將被視爲存儲過程。