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?

questionAnswers(4)

yourAnswerToTheQuestion