Como chamar corretamente as funções do PostgreSQL (procedimentos armazenados) no Spring / Hibernate / JPA?
Estou usando o Spring MVC 4, Hibernate e PostgreSQL 9.3 e defini a função (procedimento armazenado) dentro do Postgres assim:
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 eu executar essa função dentro do pgAdmin, está funcionando bem:
select spa.create_tenant('somename');
Agora estou tentando executar esta função do meu serviço da seguinte maneira:
@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 eu executar meu método, estou recebendo o seguinte erro:
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Eu estou supondo que isso é por causa do tipo de retorno nulo, que é definido na função, então eu mudei o tipo de retorno para ficar assim:
RETURNS character varying AS
Se eu executar meu método novamente, estou recebendo esta exceção:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults
Alguém sabe o que está acontecendo aqui e como chamar corretamente os procedimentos armazenados no PostgreSQL, mesmo com void como tipo de retorno?