Wie werden PostgreSQL-Funktionen (gespeicherte Prozeduren) in Spring / Hibernate / JPA richtig aufgerufen?

Ich verwende Spring MVC 4, Hibernate und PostgreSQL 9.3 und habe die Funktion (gespeicherte Prozedur) in Postgres wie folgt definiert:

CREATE OR REPLACE FUNCTION spa.create_tenant(t_name character varying)
  RETURNS void AS
  $BODY$
    BEGIN
      EXECUTE format('CREATE SCHEMA IF NOT EXISTS %I AUTHORIZATION postgres', t_name);
    END
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION spa.create_tenant(character varying)
OWNER TO postgres;

Wenn ich diese Funktion in pgAdmin wie folgt ausführe, funktioniert sie einwandfrei:

select spa.create_tenant('somename');

Jetzt versuche ich, diese Funktion von meinem Dienst aus wie folgt auszuführen:

@Override
@Transactional
public void createSchema(String name) {
    StoredProcedureQuery sp = em.createStoredProcedureQuery("spa.create_tenant");
    sp.registerStoredProcedureParameter("t_name", String.class, ParameterMode.IN);
    sp.setParameter("t_name", name);
    sp.execute();
}

Wenn ich meine Methode ausführe, wird folgender Fehler angezeigt:

javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

Ich vermute, das liegt am Rückgabetyp void, der in function definiert ist. Ich habe den Rückgabetyp folgendermaßen geändert:

RETURNS character varying AS

Wenn ich meine Methode erneut ausführe, erhalte ich stattdessen diese Ausnahme:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults

Weiß jemand, was hier vor sich geht und wie man gespeicherte Prozeduren in PostgreSQL auch mit void als Rückgabetyp richtig aufruft?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage