【问题标题】:Using JPA with stored procedures that return multiple result sets将 JPA 与返回多个结果集的存储过程一起使用
【发布时间】:2014-08-29 18:41:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: hibernate jpa stored-procedures multiple-resultsets


    【解决方案1】:

    我遇到了和你一样的问题,在这里报告了。 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-13983https://hibernate.atlassian.net/browse/HHH-13983

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

    1. 在存储过程中创建一个临时表,其中包含您在存储过程中创建和返回的每个选择查询中存在的所有唯一列。 因此,如果在选择查询#1 中检索列nameaddressuser_id,而在第二个选择查询中检索productcolordateCreated。那么你的临时表应该有列nameaddressuser_idproductcolordateCreated按该顺序定义。

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

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

    4. 现在只需将insert select productcolordateCreated 的值放入表 temp_table 中重复第 2 步。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢,但没有提供太多细节。当结果集包含不同的列时会发生什么?类层次结构应该是什么样的?应该如何定义映射以将第一个结果集映射到一个类,将第二个结果集映射到不同的类?我根本无法让 Hibernate 工作 - 我的意思是,它返回不同的结果集,就像您的文档所说的那样,但是映射错误并且值错误。到目前为止,我认为人们还没有对这个问题进行太多调查。
        • 不同的列?然后你会在列表中得到不同的列。你在说什么映射?这是一个原生查询,因此没有到实体的映射。
        • 我不了解 DataNucleus,但使用 Hibernate,第一个结果集正确返回,作为本机查询结果,但调用 spq.hasMoreResults() 会抛出:com.microsoft.sqlserver.jdbc.SQLServerException: “列名 xyz 无效”即使没有引用 POJO 进行映射也是如此。它试图重用同一个对象。如果我跳过调用 hasMoreResults() ,那么第二个结果集中的行与第一个结果集中的行相同,即使它们不应该如此。而且,如果使用实体注解,肯定会尝试映射到注解。类。
        • 我尝试了 DataNucleus (他们的夜间构建,因为我需要它来实现其他一些功能)并且对于返回 2 个具有不同列数的结果集的存储过程来说一切正常 - 我都回来了与不同的列。建议你在 Hibernate 上提出一个错误
        • 链接失效了。
        猜你喜欢
        • 1970-01-01
        • 2018-10-07
        • 2011-04-22
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多