java - 在xml中使用hibernate调用Oracle存储过程

标签 java database hibernate stored-procedures orm

我正在尝试修改 Hibernate 应用程序以包含来自 Oracle 存储过程的新选择。我之前做过返回结果集的 Oracle 存储过程,所以我知道那里需要做什么,但我对 Hibernate 不太熟悉,而且我正在努力弄清楚如何像他们完成其他调用一样执行此操作。

是的,我已经看到了有关此主题的多个 Stack Overflow 线程,但它们似乎使用了所有注释,并且此应用程序在本部分中没有使用注释,因此我希望使其尽可能接近现有代码 - 它们是报告,因此甚至不由实际的表或实体表示。

这就是我现在所处的位置:

结果集类:

public class Person {

    private Long personId;
    private String firstName;
    private String lastName;

    // constructors omitted
    // getters & setters for properties omitted
}

DAO:

public List<Person> getPeopleInDept (Integer deptId) {
    return entityManager.createNamedQuery("getPeopleInDept", Person.class)
        .setParameter("deptId", deptId)
        .getResultList();
}

XML:

<named-native-query name="getPeopleInDept" result-set-mapping="PersonMapping">
<query>
{ ? = call GET_PEOPLE_IN_DEPT (:deptId) }
</query>
</named-native-query>

<sql-result-set-mapping name="PersonMapping">
    <constructor-result target-class="package.Person">
       <column name="PERSON_ID" class="java.lang.Long"/>
       <column name="FIRST_NAME" class="java.lang.String"/>
       <column name="LAST_NAME" class="java.lang.String"/>
    </constructor-result>
</sql-result-set-mapping>

这就是全部内容,没有我未在此处显示的注释。

所以当我运行上面的代码时,我收到此错误:

java.sql.SQLException: Missing IN or OUT parameter at index:: 4

如果我尝试更改对此的调用,正如我在其他示例中看到的那样:

{ call GET_PEOPLE_IN_DEPT (?, :deptId) }

然后我得到一个不同的错误:

org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [{ call GET_PEOPLE_IN_DEPT(?, :deptId) }]

所以我的问题是,要使其正常工作,我需要做的最少修改是什么?我见过他们这样做的一个例子:

<sql-query name="callStockStoreProcedure">
<return alias="stock" class="com.mkyong.common.Stock"/>
<![CDATA[CALL GetStocks(:stockCode)]]>
</sql-query>

但这似乎是旧版本的 Hibernate 并且这些标签无效。我想我需要在新版本中做类似的事情,无论看起来像什么......

他们使用的 Hibernate 版本是 4.3

最佳答案

根据Hibernate 3.5 docs (您实际上在这里使用的是旧版 API):

For Oracle the following rules apply:

A function must return a result set. The first parameter of a procedure must be an OUT that returns a result set. This is done by

using a SYS_REFCURSOR type in Oracle 9 or 10. In Oracle you need to define a REF CURSOR type. See Oracle literature for further information.

尝试切换到 new JPA API anyway and check out this tutorial .

关于java - 在xml中使用hibernate调用Oracle存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359571/

相关文章:

Java 无法用于 Opencv 安装

mysql - 设计可以存储不同值和各自指标的表

mysql - 设计和存储货币汇率交叉表

java - 泛型类中的 hibernate 继承

java - 具有多对多外键的自定义 Hibernate NamingStrategy

java - 如何在ant中复用依赖的项目?

java - 如何将 `Period` 添加到 `java.util.Date` ?

java - 我可以覆盖在 Java 中返回 Unit 类型的 kotlin 方法吗

sql - 寻找国家时区数据库

java - 在 hibernate 中注释派生数据库列