八块腹肌的柑橘 · 重启hive服务命令 ...· 1 年前 · |
儒雅的针织衫 · Java对txt文件内容的增删该查操作 - 掘金· 1 年前 · |
阳刚的红茶 · javascript - Failed ...· 1 年前 · |
大力的椰子 · Nginx SSL 结合Tomcat ...· 1 年前 · |
我使用的是Spring MVC4、Hibernate和Postgres9.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);
$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中正确调用存储过程吗?
发布于 2018-08-16 20:50:16
如果您还在使用spring数据,则只需在
@Repository
接口中定义一个过程,
@Procedure(value = "spa.create_tenant")
public void createTenantOrSomething(@Param("t_name") String tNameOrSomething);
有关详细信息,请参阅 docs 。
发布于 2015-01-02 22:04:17
在实体类中,定义一个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)"
儒雅的针织衫 · Java对txt文件内容的增删该查操作 - 掘金 1 年前 |