【问题标题】:JPA Hibernate calling stored procedureJPA Hibernate调用存储过程
【发布时间】:2012-04-23 06:55:10
【问题描述】:

我在 Postgres 中有一个存储过程。该过程有 4 个 OUT 参数。通常使用 JPA 我无法得到结果。我想要做的是在该过程中使用 SELECT 查询。

例如,如果我在 pgAdmin 中尝试查询:

SELECT * FROM get_results (arg0, arg1 等);

我得到一个包含 4 列的结果行,其中包含 4 个 OUT 参数的结果。

但是当我尝试在 JPA 中使用它时它失败了。我正在尝试类似:

Query q = em.createNativeQuery("SELECT * FROM get_results (arg0, arg1 etc)");
q.getSingleResult();

但它会抛出一个java.lang.IllegalStateException [com.arjuna.ats.internal.jta.transaction.arjunacore.nosuchtx] [com.arjuna.ats.internal.jta.transaction.arjunacore.nosuchtx] No such transaction!

有什么建议吗?

【问题讨论】:

  • 错误信息指向事务问题。其他本地查询(例如从表中选择)是否在该位置工作?
  • 我用 count 尝试了相同的查询。 em.createNativeQuery("SELECT count(*) FROM get_results (arg0, arg1 etc)"); q.getSingleResult();结果我得到了数字“1”,这是我所期待的。所以它有效。但是现在当我尝试正常查询时,我得到一个:“[ConnectionManager] 在事务完成时强制清理批处理器资源;忘记关闭 ScrollableResults/Iterato r?”错误。

标签: java hibernate postgresql stored-procedures jpa


【解决方案1】:

JPA 2.1 现在支持存储过程,请阅读 Java 文档 here

例子:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("sales_tax");
// set parameters
storedProcedure.registerStoredProcedureParameter("subtotal", Double.class, ParameterMode.IN);
storedProcedure.registerStoredProcedureParameter("tax", Double.class, ParameterMode.OUT);
storedProcedure.setParameter("subtotal", 1f);
// execute SP
storedProcedure.execute();
// get result
Double tax = (Double)storedProcedure.getOutputParameterValue("tax");

查看详细示例here

【讨论】:

    【解决方案2】:

    使用下面的代码使用hibernate调用过程。

    Query query = session.getNamedQuery("ProcedureName")
        .setParameter(parameterName,value);
        .setParameter(parameterName,value);
        .setParameter(parameterName,value);
        .setParameter(parameterName,value);
    

    【讨论】:

    • 我无法使用此代码,因为正如我之前所说,我的程序有 4 个 OUT 参数。 JPA 仅使用 1 个 OUT 参数。所以唯一的方法是“Select * FROM procedure_name(...)”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多