Sto utilizzando Spring MVC 4, Hibernate e PostgreSQL 9.3 e hanno definito la funzione (stored procedure) all'interno di Postgres come questo:Come chiamare correttamente le funzioni di PostgreSQL (stored procedure) all'interno di Spring/Hibernate/JPA?
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;
Se corro questa funzione all'interno pgAdmin come questo sta lavorando bene:
select spa.create_tenant('somename');
Ora sto cercando di eseguire questa funzione dal mio servizio come questo:
@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();
}
Se corro il mio metodo sto ottenendo seguente errore:
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Sto indovinando questo è a causa del tipo di ritorno vuoto che viene definito in funzione così ho cambiato tipo di tornare a questo aspetto:
RETURNS character varying AS
Se eseguo il mio metodo di nuovo mi sto questa eccezione invece:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults
qualcuno sa che cosa sta succedendo qui e come chiamare correttamente stored procedure in PostgreSQL, anche con vuoto come tipo di ritorno?
Come chiameresti un JDBC CallableStatement? Ecco tutto ciò che riguarda l'API JPA. Se Hibernate non rispecchia ciò che JDBC fornisce, prova un altro provider JPA per vedere come lo gestisce. –