gpt4 book ai didi

spring - 如何在 Spring/Hibernate/JPA 中正确调用 PostgreSQL 函数(存储过程)?

转载 作者:行者123 更新时间:2023-11-29 11:28:31 34 4
gpt4 key购买 nike

我正在使用 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 也是如此?

最佳答案

如果您还使用 spring 数据,您可以像这样在 @Repository 接口(interface)中定义一个过程,

@Procedure(value = "spa.create_tenant")
public void createTenantOrSomething(@Param("t_name") String tNameOrSomething);

更多内容在 docs .

关于spring - 如何在 Spring/Hibernate/JPA 中正确调用 PostgreSQL 函数(存储过程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122796/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com