0

这是一个我正在尝试使用 OpenJPA 重新创建的 oracle 查询。我正在 Websphere 集成开发人员中编写服务,并且我使用 OpenJPA 作为我选择的 ORM 工具。以前,此查询是使用存储过程执行的,使用了 ref 游标并像这样检索信息。现在我们正在尝试使用 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 调用存储过程吗?

4

2 回答 2

1

因为你的 SQL 非常复杂,转换为 JPQL 并不容易,我建议保留它。您可以使用 OpenJPA 的 NativeQuery,它可以进行 SQL 查询。如果您的 SQL 不是以 SELECT 开头的,它将被视为存储过程。

于 2012-04-13T03:34:57.893 回答
0

您可以为每个表创建一个 JPA 实体,然后通过执行类似以下操作来连接实体:http: //openjpa.apache.org/builds/1.1.1-SNAPSHOT/docs/jpa_overview_mapping_full.html 查看@OnetoMany and @ManytoOne and @ManytoMany注释一些想法的例子。

于 2012-05-17T18:43:19.717 回答