【发布时间】:2014-11-25 04:44:27
【问题描述】:
我正在使用 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?
【问题讨论】:
-
如何调用 JDBC CallableStatement?这就是 JPA API 的全部内容。如果 Hibernate 没有反映 JDBC 提供的内容,请尝试使用不同的 JPA 提供程序,看看它是如何处理它的
标签: spring hibernate postgresql jpa