sql >> Base de Datos >  >> RDS >> PostgreSQL

JPA 2.1 StoredProcedureQuery con PostgreSQL y REF_CURSORs

Respuesta corta:invierta el orden de sus dos llamadas a registerStoredProcedureParameter() :

storedProcedure.registerStoredProcedureParameter(1, Object.class, ParameterMode.REF_CURSOR);
storedProcedure.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);

Respuesta larga:investigué un poco en Código fuente de Hibernate para la compatibilidad con declaraciones llamables de Postgress , y encontró que cada registerStoredProcedureParameter() la llamada crea un ParameterRegistrationImplementor instancia que se agrega a una lista y se pasa de un lado a otro. Notará que esta clase almacena la posición del parámetro, que es independiente de su posición dentro de la lista.

Posteriormente, esta lista es analizado y asume que el REF_CURSOR El parámetro será el primero en la línea y arrojará su mensaje de error si un REF_CURSOR el parámetro no es el primero, sin importar cuál sea el número del parámetro .

No es una forma muy brillante de hacer las cosas (en mi humilde opinión), pero al menos la solución es fácil:si cambias el orden de tus llamadas, deberías estar bien.