У меня есть процедура с двумя выходными параметрами, 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)
@elyor, что ты имеешь в виду под правильным значением?
Вы можете попробовать ResultSet.class вместо void.class для курсоров.




Похоже, вы получаете это исключение, потому что метаданные для вывода курсора отсутствуют. Вы можете попробовать использовать соответствующий тип Java для вывода курсора вместо void.class.
Согласно документации здесь, курсоры могут быть сопоставлены любому из следующих типов Java:
Например, вы можете попробовать такой способ:
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "cur_out", type = java.sql.ResultSet.class)
Вы уверены, что использовали правильное значение для типа здесь: "..., name = " cur_out ", type = void.class"?