Как правильно вызывать функции PostgreSQL (хранимые процедуры) в Spring / Hibernate / JPA?

Я использую Spring MVC 4, Hibernate и PostgreSQL 9.3 и определил функцию (хранимую процедуру) внутри Postgres следующим образом:

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;

Если я запускаю эту функцию внутри pgAdmin, она работает нормально:

select spa.create_tenant('somename');

Теперь я пытаюсь запустить эту функцию из моего сервиса следующим образом:

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

Если я запускаю свой метод, я получаю следующую ошибку:

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

Я предполагаю, что это из-за возвращаемого типа void, который определен в функции, поэтому я изменил тип возвращаемого значения так:

RETURNS character varying AS

Если я снова запускаю свой метод, я получаю это исключение:

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

Кто-нибудь знает, что здесь происходит и как правильно вызывать хранимые процедуры в PostgreSQL даже с void в качестве возвращаемого типа?

Ответы на вопрос(4)

Ваш ответ на вопрос