Ich verwende Spring MVC 4, Hibernate und PostgreSQL 9.3 und haben Funktion (Stored Procedure) innerhalb Postgres wie folgt definiert:Wie werden PostgreSQL-Funktionen (gespeicherte Prozeduren) in Spring/Hibernate/JPA korrekt aufgerufen?
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ühren es funktioniert gut:
select spa.create_tenant('somename');
Jetzt versuche ich, diese Funktion von meinem Dienst 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ühren ich folgende Störung zu erhalten:
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
ich dies zu raten ist, weil der Rückgabetyp Leere, die in Funktion definiert ist, so änderte ich Typ zurückgeben wie folgt aussehen:
RETURNS character varying AS
Wenn ich meine Methode laufen wieder erhalte ich statt diese Ausnahme:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults
weiß jemand, was hier vor sich geht und wie man richtig gespeicherte Prozeduren in PostgreSQL rufen auch bei Leere als Rückgabetyp?
Wie würden Sie ein JDBC-Callablestatement nennen? Das ist alles, was die JPA-API umschließt. Wenn Hibernate nicht das widerspiegelt, was JDBC gibt, versuchen Sie einen anderen JPA-Provider, um zu sehen, wie dieser behandelt wird. –