【问题标题】:Executing Oracle Stored Procedure with Hibernate使用 Hibernate 执行 Oracle 存储过程
【发布时间】:2016-12-15 14:48:44
【问题描述】:

我一直在尝试使用 Hibernate 执行 Oracle 存储过程。这不是用于生产 - 而是用于我正在追求的 Java 源代码解析项目。简而言之,我无法从 Oracle 存储过程中返回值。

我已经搜索并阅读了来自 SO、Hibernate 社区/文档(本机 SQL 章节)链接的所有相关链接,并尝试了这些建议,但不知何故无法让它们发挥作用。以下是我的来源 - 我只包括相关部分。

我的实体类。我为 PL/SQL OUT 参数保留了第一个参数。

登录.java

@NamedNativeQuery(
        name = "getLoginDet", 
        query = "call GET_LOGIN_DET(?,:userId)", 
        resultClass = Login.class)
@Entity
@Table(name = "T_LOGIN_DET")
public class Login {

Oracle 存储过程:GET_LOGIN_DET.sql。第一个参数是 OUT REFCURSOR 按照 Hibernate Spec

create or replace PROCEDURE GET_LOGIN_DET(listLogin OUT SYS_REFCURSOR,userId IN VARCHAR2)
AS 
BEGIN
OPEN listLogin FOR 
        SELECT *
        FROM T_LOGIN_DET 
        WHERE USER_ID = userId;
  END GET_LOGIN_DET;

我的 DAO 类:我只绑定命名参数,忽略第一个?在命名查询中。

Session session = sessionFactory.openSession();
List results = session.getNamedQuery("getLoginDet").setParameter("userId", u.getUserId()).list();

我的休眠配置

<bean id="mysessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.cogn.gto.sea.employee.entity.Employee</value>
            <value>com.cogn.gto.sea.employee.entity.Department</value>
            <value>com.cogn.gto.sea.login.entity.User</value>
            <value>com.cogn.gto.sea.login.entity.Login</value>  
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
            <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

但是,我总是以 Hibernate QueryException / Java SQLException 结束

Expected positional parameter count: 1, actual parameters: [] [{call GET_LOGIN_DET(?,:userId)}]

我尝试了{? = call GET_LOGIN_DET(:userId)}call GET_LOGIN_DET(?,:userId) 的变体,但无济于事。我的要求是调用我列出的过程并将结果返回到 DAO 类中。有人可以带我了解我在这里缺少什么吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我相信你错误地声明了对存储过程的调用(缺少大括号),试试这个:

    @NamedNativeQuery(
            name = "getLoginDet", 
            query = "{call GET_LOGIN_DET(?,:userId)}", 
            resultClass = Login.class
            hints = {@QueryHint(name = "org.hibernate.callable", value = "true")})
    @Entity
    @Table(name = "T_LOGIN_DET")
    public class Login {
    

    【讨论】:

    • 这非常有效。关键是 QueryHint,没有它它需要两个参数。谢谢。
    猜你喜欢
    • 2014-03-13
    • 2016-04-13
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2011-02-25
    • 2014-11-13
    相关资源
    最近更新 更多