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?