这是我尝试使用OpenJPA重新创建的oracle查询。我正在Websphere集成开发人员中编写服务,我正在使用OpenJPA作为我选择的ORM工具。以前,这个查询是使用存储过程执行的,使用了引用游标,并且像这样检索了信息。现在我们尝试使用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调用存储过程吗?
答案 0 :(得分:1)
因为你的SQL非常复杂,所以转换为JPQL并不容易,我建议保留它。 您可以使用OpenJPA的NativeQuery,它可以执行SQL查询。如果您的SQL没有使用SELECT启动,它将被视为存储过程。
答案 1 :(得分:0)
您可以为每个表创建一个JPA实体,然后通过执行类似于此的操作来加入实体:
http://openjpa.apache.org/builds/1.1.1-SNAPSHOT/docs/jpa_overview_mapping_full.html
查看示例中的@OnetoMany and @ManytoOne and @ManytoMany
注释以获取一些想法。