【问题标题】:StoredProcedureQuery multiple output typeStoredProcedureQuery 多种输出类型
【发布时间】:2018-11-30 08:57:05
【问题描述】:

我有一个程序,它有 2 个输出参数,varchar2 和 ref_cursor

PROCEDURE login_check (id_in         IN     edit_users.userid%TYPE,
                      password_in   IN     edit_users.usr_password%TYPE,
                      status_out       OUT VARCHAR2,
                      cur_out          OUT SYS_REFCURSOR
                     )

我定义了一个 namedStoredProcedureQuery

  @NamedStoredProcedureQuery(name = "login_check",
            procedureName = "edit_maintenance.login_check",
    parameters = {
            @StoredProcedureParameter(mode = ParameterMode.IN, name ="id_in",type = String.class),
            @StoredProcedureParameter(mode = ParameterMode.IN, name ="password_in",type = String.class),
            @StoredProcedureParameter(mode = ParameterMode.OUT, name ="status_out",type = String.class),
            @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name ="cur_out", type = void.class)

    })

当我通过storedProcedureQuery调用这个过程时,我可以得到“status_out”,但是调用getResultList方法时我得到了一个空点异常。

 StoredProcedureQuery storedProcedureQuery = em.createNamedStoredProcedureQuery("login_check");
    storedProcedureQuery.setParameter("id_in",username);
    storedProcedureQuery.setParameter("password_in",password);
    storedProcedureQuery.execute();
    String status = (String)storedProcedureQuery.getOutputParameterValue("status_out");
    System.out.println(status);
    List<UserTo> userToList = storedProcedureQuery.getResultList();
    return userToList.get(0);

ava.lang.NullPointerException
at org.hibernate.loader.custom.JdbcResultMetadata.<init>(JdbcResultMetadata.java:32)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:476)
at org.hibernate.result.internal.OutputsImpl$CustomLoaderExtension.processResultSet(OutputsImpl.java:285)
at org.hibernate.result.internal.OutputsImpl.extractResults(OutputsImpl.java:136)
at org.hibernate.procedure.internal.ProcedureOutputsImpl.access$500(ProcedureOutputsImpl.java:26)
at org.hibernate.procedure.internal.ProcedureOutputsImpl$ProcedureCurrentReturnState.lambda$buildExtendedReturn$0(ProcedureOutputsImpl.java:95)
at org.hibernate.result.internal.ResultSetOutputImpl.getResultList(ResultSetOutputImpl.java:41)
at org.hibernate.procedure.internal.ProcedureCallImpl.getResultList(ProcedureCallImpl.java:756)
at com.schenker.editrade.repository.UserRepositoryImpl.loginCheck(UserRepositoryImpl.java:23)
at com.schenker.editrade.repository.UserRepositoryImpl$$FastClassBySpringCGLIB$$61af36ef.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

【问题讨论】:

  • 你确定你在这里使用了正确的类型值:“..., name ="cur_out", type = void.class"?
  • @elyor,正确的价值是什么意思?
  • 您可以尝试使用 ResultSet.class 而不是 void.class 作为游标。

标签: java spring oracle procedure


【解决方案1】:

您似乎遇到了这个异常,因为您的光标输出的元数据丢失了。您可以尝试为光标输出使用适当的 Java 类型,而不是“void.class”。

根据文档here,游标可以映射到以下Java类型之一:

  • java.sql.ResultSet
  • sqlj.runtime.ResultSetIterator

例如,你可以这样尝试:

@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name ="cur_out", type = java.sql.ResultSet.class)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多