我正在使用Spring MVC 4,Hibernate和PostgreSQL 9.3,并在PostgreSQL中定义了如下的函数(存储过程):
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
有人知道这里发生了什么,如何正确调用具有void返回类型的PostgreSQL存储过程吗?