Как правильно вызывать функции 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 в качестве возвращаемого типа?