我正在使用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
最佳答案
在你的实体类中,定义一个NamednativeQuery,就像你用select调用postgresql函数一样.
import javax.persistence.NamednativeQueries;
import javax.persistence.NamednativeQuery;
import javax.persistence.Entity;
@NamednativeQueries(
value={
// cast is used for Hibernate,to prevent No Dialect mapping for JDBC type: 1111
@NamednativeQuery(
name = "Tenant.createTenant",query = "select cast(create_tenant(?) as text)"
)
}
)
@Entity
public class Tenant
hibernate无法映射void,因此解决方法是将结果转换为文本
public void createSchema(String name) {
Query query = em.createNamedQuery("Tenant.createTenant")
.setParameter(1,name);
query.getSingleResult();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。