将JPA与返回多个结果集的存储过程一起使用

时间:2014-07-08 21:21:00

标签: hibernate jpa stored-procedures multiple-resultsets

是否可以使用JPA处理SQL Server中存储过程具有不同列的多个结果集?这样做的方式(或最佳方式)是什么?

我目前正在使用Hibernate 4.3.5 Final和JPA 2.1,SqlServer 2008。

我现在的方法的传奇可以在这里找到:Hibernate JPA, inheritance and Stored Procedure returning multiple result sets

但显然不是正确的做法。如果有人知道如何做这项工作,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:1)

使用我使用的JPA实现的文档,您可以在此页面上看到检索多个结果集的JPA标准方法。向下翻页为“广义执行,多个结果集”

http://www.datanucleus.org/products/accessplatform_4_0/jpa/stored_procedures.html

答案 1 :(得分:0)

当每个结果集返回不同的列时,您可以创建不同的DTO来收集结果,并使所有DTO来实现接口或扩展抽象类(抽象类应包含所有结果集公用的列)。然后,返回类型应该是已实现的接口/抽象类。根据我的经验,这行得通。

答案 2 :(得分:0)

我遇到了与您相同的问题,并在此处报告了该问题。 https://dba.stackexchange.com/questions/265890/can-a-mysql-stored-procedure-return-multiple-resultsets-each-containing-differen?noredirect=1#comment523515_265890

这似乎是设计缺陷,因此我在https://hibernate.atlassian.net/browse/HHH-13983

上也创建了一个关于该问题的错误问题。

当前,Hibernate似乎不支持同时检索具有不同列集的多个结果集。但是有一个解决方法,它是这样的:

  1. 在存储过程中创建一个临时表,该表由在存储过程中进行并返回的每个选择查询中存在的所有唯一列组成。 因此,如果在选择查询#1中您正在检索列nameaddressuser_id,而在第二个选择查询中您正在检索productcolordateCreated。然后,您的临时表应按该顺序定义列nameaddressuser_idproductcolordateCreated

  2. 在创建的临时表中选择nameaddressuser_id的数据。接下来,从temp_table中选择*。现在,将6列的结果集作为第一个结果集返回。在应用程序端,您可以从ObjectField数组元素0、1和2检索名称,地址和user_id。

  3. 使用命令TRUNCATE TABLE temp_table清空temp_table。

  4. 仅在您将insert selectproductcolor的值dateCreated插入表temp_table的情况下,才重复步骤2。

  5. 从temp_table中选择结果,您可以从Object []元素3 4和5中获取数据。最后删除temp_table以释放内存资源。