相关疑难解决方法(0)

如何在REST Web服务中实现最简单的外星人?

我需要一个JSON 端点,直接从存储过程返回数据.例:

@Procedure("complex")
String complexStoredProcedure();
Run Code Online (Sandbox Code Playgroud)

最简单的情况是没有参数的GET端点...返回的数据是一个(blabck-box)JSON,与Spring 实体没有任何关系,也没有特殊的数据类型(我的Spring应用程序的"外来数据类型") ...

如果你需要一个例子,假设一个简单的控制器为

@RequestMapping(value="/howto", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@Procedure(name = "MyRandom.random")  // ?? not work
public String howto() { 
    double x = random();  // from stored-procedure call, how to do it?
    return "{\"result\":"+x+"}";
}
Run Code Online (Sandbox Code Playgroud)

怎么实现呢?也就是说, 实现控制器方法的最简单方法(调用存储过程)?


编辑:清理冗余的代码片段,转移到下面的答案-Wiki.

rest stored-procedures spring-boot

7
推荐指数
1
解决办法
1176
查看次数

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

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

如果我像这样在pgAdmin中运行此函数它工作正常:

select spa.create_tenant('somename');
Run Code Online (Sandbox Code Playgroud)

现在我正试图从我的服务运行这个功能,如下所示:

@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();
}
Run Code Online (Sandbox Code Playgroud)

如果我运行我的方法,我会收到以下错误:

javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Run Code Online (Sandbox Code Playgroud)

我猜这是因为在函数中定义的返回类型void所以我将返回类型更改为如下所示:

RETURNS character varying AS
Run Code Online (Sandbox Code Playgroud)

如果我再次运行我的方法,我会得到这个例外:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: …
Run Code Online (Sandbox Code Playgroud)

postgresql spring hibernate jpa

5
推荐指数
2
解决办法
2万
查看次数