JPA和ORACLE函数:使用NamedNativeQuery调用存储过程时出错

时间:2015-09-25 08:33:32

标签: java oracle jsp jpa stored-procedures

我有一个Oracle函数

CREATE OR REPLACE FUNCTION SOL.UPDATE_LD_OAUDITORID (
vCUSTOMERID       NUMBER,
vAPPOINTOFCAID    NUMBER,
vAUDITORID        NUMBER,
vOAUDITORID       NUMBER)

RETURN NUMBER
IS
PRAGMA AUTONOMOUS_TRANSACTION;

vGROUPID      NUMBER;
rTN           NUMBER;

CURSOR c
IS
  SELECT COMPANYID,
         GROUPID,
         PERIODID,
         PROCESSID,
         CUSTOMERID,
         APPOINTOFCAID,
         AUDITORID
    FROM LIQUIDATIONSDETAILS
   WHERE     CUSTOMERID = vCUSTOMERID
         AND APPOINTOFCAID = vAPPOINTOFCAID
         AND AUDITORID = vAUDITORID
         AND (       PERIODID = fn_periodcurrent
                 AND PROCESSID = FN_PROCESSCURRENT
              OR PERIODID = fn_periodNEXT AND PROCESSID = FN_PROCESSNEXT) FOR UPDATE;

TYPE nt_type IS TABLE OF c%ROWTYPE;
l_arr         nt_type;
DML_ERRORS    EXCEPTION;
PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
l_errors      NUMBER;
errorCnt      NUMBER;
errString     VARCHAR2 (4000);
l_idx         NUMBER;
BEGIN
SELECT FN_CURRENTGROUP (vOAUDITORID) INTO vGROUPID FROM DUAL;

OPEN c;

LOOP
  FETCH c
  BULK COLLECT INTO l_arr
  LIMIT 500;

  EXIT WHEN l_arr.COUNT = 0;

  BEGIN
     FORALL i IN 1 .. l_arr.COUNT SAVE EXCEPTIONS
        UPDATE liquidationsdetails
           SET groupid = vgroupid, auditorid = vOAUDITORID
         WHERE     COMPANYID = l_arr (i).COMPANYID
               AND GROUPID = l_arr (i).GROUPID
               AND PERIODID = l_arr (i).PERIODID
               AND PROCESSID = l_arr (i).PROCESSID
               AND CUSTOMERID = l_arr (i).CUSTOMERID
               AND APPOINTOFCAID = l_arr (i).APPOINTOFCAID
               AND AUDITORID = l_arr (i).AUDITORID;

     RTN := 1;
  EXCEPTION
     WHEN dml_errors
     THEN                        -- Now we figure out what failed and why.
        errorCnt := SQL%BULK_EXCEPTIONS.COUNT;
        errString :=
           'Number of statements that failed: ' || TO_CHAR (errorCnt);

        RTN := 0;
  END;
END LOOP;

CLOSE C;

COMMIT;

RETURN RTN;
END;
/

一个虚拟实体bean,其中namednativequery是函数的调用

@Entity
@NamedNativeQueries({
@javax.persistence.NamedNativeQuery(name = "updateldoauditorid", query = ""
        + "{? =  call UPDATE_LD_OAUDITORID(:customerid, :appointofcaid, :auditorid, :oauditorid)}", resultClass = DummyEntity.class,
        hints = {
            @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true")})})

public class DummyEntity implements Serializable {
...

无国籍会议

@Override
public int spUpdate_ld_oauditorid(String customerid, String appointofcaid, String auditorid, String oauditorid) {
    Integer isup = (Integer) em.createNamedQuery("updateldoauditorid")
            .setParameter(customerid, customerid)
            .setParameter(appointofcaid, appointofcaid)
            .setParameter(auditorid, auditorid)
            .setParameter(oauditorid, oauditorid)
            .getSingleResult();

    return isup;
}

调用以下

的jsp页面
try {
        update = dummyFacade.spUpdate_ld_oauditorid(customerid, appointofcaid, auditorid, oauditorid);

    } catch (Exception ex) {
        ex.printStackTrace();
    }

我收到错误

  

java.lang.NullPointerException at   org.apache.jsp.members.appointsofcas.liquidations.liquidations_005fa_005foauditorid_jsp.Updateldoauditorid(liquidations_005fa_005foauditorid_jsp.java:96)at at   org.apache.jsp.members.appointsofcas.liquidations.liquidations_005fa_005foauditorid_jsp._jspService(liquidations_005fa_005foauditorid_jsp.java:415)   执行jsp页面时

1 个答案:

答案 0 :(得分:1)

在无状态会话Bean中,您正在错误地设置参数。您使用参数值两次,当您致电""时,您可能忘记了第一个参数的setParameter()

@Override
public int spUpdate_ld_oauditorid(String customerid, String appointofcaid, String auditorid, String oauditorid) {
    Integer isup = (Integer) em.createNamedQuery("updateldoauditorid")
        .setParameter("customerid", customerid)
        .setParameter("appointofcaid", appointofcaid)
        .setParameter("auditorid", auditorid)
        .setParameter("oauditorid", oauditorid)
        .getSingleResult();

return isup;
}