L'appel correctement fonctions PostgreSQL (procédures stockées) dans Spring/Hibernate/JPA?

Je suis à l'aide de Spring MVC 4, Hibernate et PostgreSQL 9.3 et ont défini la fonction (procédure stockée) à l'intérieur de Postgres comme ceci:

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;

Si je lance cette fonction à l'intérieur de pgAdmin comme cela ça fonctionne:

select spa.create_tenant('somename');

Maintenant j'essaie de l'exécuter cette fonction à partir de mon service comme celui-ci:

@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();
}

Si je lance ma méthode, j'obtiens l'erreur suivante:

javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

Je devine que c'est à cause de type de retour void qui est définie dans la fonction j'ai changé de type de retour pour ressembler à ceci:

RETURNS character varying AS

Si je lance ma méthode encore, je suis l'obtention de cette exception au lieu:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults

Personne ne sait ce qui se passe ici et comment bien appeler des procédures stockées dans PostgreSQL, même avec void comme type de retour?

Comment appelleriez-vous un JDBC CallableStatement? C'est tout l'API JPA s'enroule autour de. Si Hibernate n'est pas un miroir de ce que JDBC donne alors essayez un autre fournisseur JPA pour voir comment ça gère

OriginalL'auteur Mirko Filipovic | 2014-09-30