加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Spring / Hibernate / JPA中正确调用PostgreSQL函数(存储

发布时间:2020-12-15 01:43:33 所属栏目:大数据 来源:网络整理
导读:我正在使用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

我正在使用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?

最佳答案
在你的实体类中,定义一个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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读