Java Hibernate函数返回ORA-14551

Java Hibernate函数返回ORA-14551,java,oracle,hibernate,Java,Oracle,Hibernate,我试图调用一个函数,该函数在带有Hibernate 4.3.11.Final的oracle 11g中返回一个整数。buuut当我尝试调用它时,它会引发以下异常: ORA-14551: cannot perform a DML operation inside a query 这是命名查询: @NamedNativeQuery(name = "generaFolio", query = " { CALL GENERA_FOLIO( :idArea ) } ") 函数中有一个游

我试图调用一个函数,该函数在带有Hibernate 4.3.11.Final的oracle 11g中返回一个整数。buuut当我尝试调用它时,它会引发以下异常:

 ORA-14551: cannot perform a DML operation inside a query
这是命名查询:

@NamedNativeQuery(name = "generaFolio",
        query = " { CALL GENERA_FOLIO( :idArea ) } ")
函数中有一个游标和一个更新语句

功能如下:

    create or replace FUNCTION GENERA_FOLIO 
        (
        areaorigen number
        ) return number
        as
        v_FOLIO      number;
        resource_busy EXCEPTION;
        timeout_expired EXCEPTION;

        PRAGMA EXCEPTION_INIT(timeout_expired,-30006);
        PRAGMA EXCEPTION_INIT (r

esource_busy, -54);

    cursor c1 is 
      select FOLIO FROM FOLIOS f1
        WHERE  
          folio = (select min(folio) from Folios f2 where f2.IDAREA = areaorigen and vlock='D')
          and f1.idarea = areaorigen 
          and vlock='D'
      for update nowait;

    BEGIN

         -- DBMS_OUTPUT.put_line('Folio para area :: ' || areaorigen);

         BEGIN
             open c1;
             fetch c1 into v_FOLIO;
             close c1;
         EXCEPTION
                 When no_data_found then
                 RAISE_APPLICATION_ERROR (-20001, 'No Existen datos en Folio-area : ' || areaorigen);
                 When timeout_expired then
                 RAISE_APPLICATION_ERROR (-20002, 'Tiempo de Espera consumido para area : ' || areaorigen);
                 When resource_busy then
                 RAISE_APPLICATION_ERROR (-20003, 'Folio bloqueado, para la area : ' || areaorigen);
                 When others then
                 RAISE_APPLICATION_ERROR (-20004, 'Fallo en el momento de tomar folio, de la sig. area: ' ||
                                          areaorigen ||  ' >> Error number ' || SQLCODE || ' >> ' || SQLERRM);
         end;

         --DBMS_OUTPUT.put_line('Folio a Bloquear :: ' || v_folio);

         UPDATE folios SET vlock = 'A'
         WHERE  IDAREA = areaorigen 
         and folio = v_FOLIO;

        --DBMS_OUTPUT.put_line('Folio a Bloqueado! ');

    return  v_FOLIO;
    end GENERA_FOLIO;
我执行它的方式是:

Query query = getSession().getNamedQuery(queryName);    
setParameters(params, query);
Object uniqueResult = query.uniqueResult();
调用另一个返回varchar2且只包含SELECTs的函数就可以了

请帮助:(

注1: 将查询声明为:

@NamedNativeQuery(name = "generaFolio", //
query = " { ? = CALL GENERA_FOLIO( :idArea ) } ") })
这给我带来了一个错误:

org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [{ ? = CALL GENERA_FOLIO( :idArea ) }]
因为,据我所知,您可以通过位置(“?”)或标识符(“:idArea”)定义参数,我只设置一个:/

注2:

我也试过:

比如:

    @NamedNativeQuery(name = "generaFolio", //
    query = " { ? = CALL GENERA_FOLIO( :idArea ) } ", //
    hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }),

    @NamedNativeQuery(name = "generaFolio2", //
    query = "{ call GENERA_FOLIO(?,:idArea) }", //
    hints = { @QueryHint(name = "org.hibernate.callable", value = "true") })
但在以下方面:

Object uniqueResult = query.getFirstResult();

两者都返回NULL…

通过将此PRAGMA添加到Oracle函数来避免ORA-14551错误:

pragma autonomous_transaction;

最好通过修改Hibernate/Java以在不同的上下文中调用函数来解决此问题,但我不知道怎么做。

请编辑问题并包含过程的代码,因为这就是错误所在。谢谢。为什么每次尝试运行命名qu时都要执行
创建或替换
ery?为什么不先定义函数,然后调用函数来检索值呢?看起来hibernate在内部试图从dual中执行
选择generas\u FOLIO(:idArea)-可能是因为uniqueResult()?尝试使用
query=“{?=call generas\u FOLIO(:idArea)}
和query.getResultList()相反。请看@SeanMickey,这只是我的oracle服务器上的函数定义,而不是我所称的方式。@Timekiller YEES!没错,这就是错误,我想,我也尝试过了,Buuuuuuut,让我编辑这个问题来告诉你发生了什么事都德!成功了!不得不将查询更改为“从dual中选择GENERA\u FOLIO(:idArea)”“在函数结束时,提交了一次,但成功了!非常感谢!