StoredProcedureQuery с несколькими типами вывода

У меня есть процедура с двумя выходными параметрами, 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 30.11.2018 12:17

@elyor, что ты имеешь в виду под правильным значением?

njnu_zhoubo 03.12.2018 05:13

Вы можете попробовать ResultSet.class вместо void.class для курсоров.

elyor 03.12.2018 12:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
552
1

Ответы 1

Похоже, вы получаете это исключение, потому что метаданные для вывода курсора отсутствуют. Вы можете попробовать использовать соответствующий тип Java для вывода курсора вместо void.class.

Согласно документации здесь, курсоры могут быть сопоставлены любому из следующих типов Java:

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

Например, вы можете попробовать такой способ:

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

Другие вопросы по теме