Resposta curta:Inverta a ordem de suas duas chamadas para
registerStoredProcedureParameter()
:storedProcedure.registerStoredProcedureParameter(1, Object.class, ParameterMode.REF_CURSOR);
storedProcedure.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
Resposta longa:fiz algumas pesquisas no Código-fonte do Hibernate para suporte a instruções chamáveis do Postgress , e descobri que cada
registerStoredProcedureParameter()
chamada cria um ParameterRegistrationImplementor
instância que é colocada em uma lista e repassada. Você notará que essa classe armazena a posição do parâmetro, que é independente de sua posição na lista. Mais tarde, esta lista é analisado e assume que o
REF_CURSOR
será o primeiro na linha e lançará sua mensagem de erro se um REF_CURSOR
parâmetro não é o primeiro, independentemente do número do parâmetro . Não é uma maneira muito brilhante de fazer as coisas (IMHO), mas pelo menos a solução alternativa é fácil:se você trocar a ordem de suas chamadas, deve ficar bem.