我最近一直在尝试使用带有多个REF_CURSOR结果集的JPA 2.1 NamedStoredProcedureQuery注释,到目前为止我试图使用Hibernate版本5.1.3-FINAL和Oracle 11g(尝试过的JDBC驱动程序版本:10.2)一直没有成功. 0.2和11.2.0.3).
我认为在阅读JPA 2.1规范 3.10.17.1命名存储过程查询后,应该可以这样做,其中包含以下段落:
存储过程可能返回多个结果集.与本机查询一样,结果集的映射可以根据resultClasses或resultSetMappings注释元素指定.如果有多个结果集,则假定它们将使用相同的机制进行映射 - 例如,所有结果类映射都是映射,或者全部通过一组结果集映射进行映射
如果我使用的方法对于这个版本的Hibernate无效,或者我错过了一个关键的配置步骤,下面是采取的方法,希望有人能够指出我正确的方向:
@NamedStoredProcedureQuery(name = "multiResultSetExample", procedureName = "PACKAGE.p_stored_procedure", resultClasses = {ResultEntityOne.class, ResultEntityTwo.class}, parameters = { @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class), @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class), @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class) } ) @Entity public class ResultEntityOne { … }
上面的查询调用如下,但在检查结果时,只映射上面NamedStoredProcedureQuery resultClasses
属性中指定的第一个类:
EntityManagerFactory entityManagerFactory = (EntityManagerFactory) ctx.getBean("entityManagerFactory"); EntityManager entityManager = entityManagerFactory.createEntityManager(); StoredProcedureQuery storedProcedureQuery = entityManager.createNamedStoredProcedureQuery("multiResultSetExample "); storedProcedureQuery.setParameter(3, "PARAM"); List resultList = storedProcedureQuery.getResultList(); // only returns a single result set containing list of ResultEntityOne instances
为了支持上述方法的有效性,值得注意的是,当切换到Eclipselink 2.6.4时,它完全按预期工作,无需对上面的代码片段中突出显示的注释进行任何更改.
Hibernate不符合JPA 2.1吗?或者我在这里遗失了什么?