Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用本机SQL Hibernate从存储过程中检索值_Java_Hibernate_Orm_Hibernate Mapping_Native Sql - Fatal编程技术网

Java 使用本机SQL Hibernate从存储过程中检索值

Java 使用本机SQL Hibernate从存储过程中检索值,java,hibernate,orm,hibernate-mapping,native-sql,Java,Hibernate,Orm,Hibernate Mapping,Native Sql,以下是存储过程: create or replace procedure proc_emp_name(v_emp out emp.emp_name%TYPE, v_empid in emp.emp_id%TYPE) is begin select emp_name into v_emp from emp where emp_id = v_empid; dbms_output.put_line('Emp Name: ' || v_emp); dbms_output.put_line('Proce

以下是存储过程:

create or replace procedure 
proc_emp_name(v_emp out emp.emp_name%TYPE, v_empid in emp.emp_id%TYPE)
is
begin
select emp_name into v_emp from emp where emp_id = v_empid;
dbms_output.put_line('Emp Name: ' || v_emp);
dbms_output.put_line('Procedure created successfully!!!');
end;
我想使用本机SQL调用它,但不确定如何从过程中检索OUT参数

请告诉我调用该过程并从中获得结果的最简单方法

编辑

根据建议,在检查文档时,我将第一个参数修改为SYS_REFCURSOR,如下所示:

create or replace procedure
proc_empname_refcursor(v_empname OUT SYS_REFCURSOR, v_deptid in emp.emp_id%type)
is 
begin
open v_empname for select * from dept where dept_id = v_deptid;
end;
我可以使用NamedQuery调用它,但由于其他一些限制,我不想在映射文件中添加任何内容。我尝试了以下代码,以便在不使用NamedQuery的情况下调用proc,但没有成功:

Query query = session.createSQLQuery(
                "CALL proc_empname_refcursor(?, :deptId)")
                .addEntity(Dept.class)
                .setParameter("deptId", new Integer(2));

            List<Dept> departments = query.list();
            for(int i=0; i<departments.size(); i++){
                Dept department = (Dept)departments.get(i);
                System.out.println("Dept Id: " + department.getDeptId());
                System.out.println("Dept Name: " + department.getDeptName());
            }
请告诉我如何解决此问题。

发件人:

除非遵循某些过程/函数规则,否则不能将存储过程用于Hibernate

对于Oracle,函数必须返回结果集。过程的第一个参数必须是返回结果集的OUT

来自:

除非遵循某些过程/函数规则,否则不能将存储过程用于Hibernate


对于Oracle,函数必须返回结果集。过程的第一个参数必须是返回结果集的OUT

我在Hibernate和MS SQL Server中使用以下代码成功地从存储过程中获取out参数:

@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
    Connection connection = session.connection();
    CallableStatement callable = null;
    try {
        callable = connection.prepareCall("execute [procedure] ?");
        callable.registerOutParameter(1, Types.INTEGER);
        callable.execute();
        int id = callable.getInt(1);

        return id;
    } catch (SQLException e) {
        (...)
    } finally {
        (...)
    }
}

我在Hibernate和MS SQL Server中使用以下代码成功地从存储过程中获取了out参数:

@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
    Connection connection = session.connection();
    CallableStatement callable = null;
    try {
        callable = connection.prepareCall("execute [procedure] ?");
        callable.registerOutParameter(1, Types.INTEGER);
        callable.execute();
        int id = callable.getInt(1);

        return id;
    } catch (SQLException e) {
        (...)
    } finally {
        (...)
    }
}

session.connection已弃用,您知道如何替换它吗?请告诉我您使用的是什么Hibernate版本?我使用的是Hibernate v3.2.5您确定session.connection已弃用吗?我在上查看了Hibernate javadocs,但找不到不推荐的标记检查此:session.connection已不推荐使用,您知道如何替换它吗?您能告诉我您使用的是什么Hibernate版本吗?我使用的是Hibernate v3.2.5您确定session.connection不推荐使用吗?我在上查看了HibernateJavadocs,没有找到一个不推荐的标记检查:谢谢你提供的信息。我可以通过将proc作为命名查询添加到映射文件中来调用它。但现在的问题是,我不想将其添加到映射中,并将其用作命名查询,而是想直接使用createSQLQuery调用它。我试过了,但出现了一个异常:org.hibernate.QueryException:预期的位置参数计数:1,实际参数:[[CALL proc_empname_refcursor?,:deptId]我已经更新了我的第一篇文章,以提供我所尝试的内容,请告诉我如何解决此异常。删除“?”。它应该是CALL proc_empname_refcursor:deptId。请参见示例,如果我删除了?然后我得到了这个异常:java.sql.SQLException:ORA-06553:PLS-306:调用'PROC_EMPNAME_REFCURSOR'时参数的数量或类型错误您是否能够解决这个问题,因为我在通过hibernateThanks调用存储函数获取信息时也遇到了同样的问题。我可以通过将proc作为命名查询添加到映射文件中来调用它。但现在的问题是,我不想将其添加到映射中,并将其用作命名查询,而是想直接使用createSQLQuery调用它。我试过了,但出现了一个异常:org.hibernate.QueryException:预期的位置参数计数:1,实际参数:[[CALL proc_empname_refcursor?,:deptId]我已经更新了我的第一篇文章,以提供我所尝试的内容,请告诉我如何解决此异常。删除“?”。它应该是CALL proc_empname_refcursor:deptId。请参见示例,如果我删除了?然后我得到了这个异常:java.sql.SQLException:ORA-06553:PLS-306:调用'PROC_EMPNAME_REFCURSOR'时参数的数量或类型错误。当我通过hibernate调用存储函数时也遇到同样的问题,您是否能够解决这个问题