Кратък отговор:Обърнете реда на двете ви извиквания към registerStoredProcedureParameter()
:
storedProcedure.registerStoredProcedureParameter(1, Object.class, ParameterMode.REF_CURSOR);
storedProcedure.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
Дълъг отговор:Разрових се в Изходен код на Hibernate за поддръжка на извикващи изрази на Postgress
и установи, че всеки registerStoredProcedureParameter()
повикването създава ParameterRegistrationImplementor
екземпляр, който се поставя в списък и се предава наоколо. Ще забележите, че този клас съхранява позицията на параметъра, която е независима от позицията му в списъка.
По-късно този списък е анализирани
и предполага, че REF_CURSOR
параметърът ще бъде първи на ред и ще изведе вашето съобщение за грешка, ако REF_CURSOR
параметърът не е първи, независимо какъв е номерът на параметъра .
Не е много интелигентен начин за правене на нещата (IMHO), но поне заобиколното решение е лесно:ако размените реда на обажданията си, трябва да сте добре.