具有TIMESTAMP参数类型的PostgreSQL存储过程的Hibernate调用

时间:2016-11-24 14:35:59

标签: java postgresql hibernate stored-procedures spring-boot

我有一个PostgreSQL数据库,我在其中创建了以下存储过程:

 CREATE OR REPLACE FUNCTION saveOrUpdateTicket(param1 bytea, p_date timestamp, param3 INTEGER) RETURNS Integer AS $$

        DECLARE
            ....
        END;
        $$ LANGUAGE plpgsql;

我想使用 Hibernate StoredProcedureQuery从我的Java后端调用此存储过程。宣言:

StoredProcedureQuery storedProcedureQuery = msidEntityManager.createStoredProcedureQuery("saveOrUpdateTicket");

storedProcedureQuery.registerStoredProcedureParameter(1, byte[].class, ParameterMode.IN);
storedProcedureQuery.registerStoredProcedureParameter(2, java.util.Date.class, ParameterMode.IN);
storedProcedureQuery.registerStoredProcedureParameter(3, Integer.class, ParameterMode.IN);

storedProcedureQuery.setParameter(1, key);
storedProcedureQuery.setParameter(2, new Date());
storedProcedureQuery.setParameter(3, val);

storedProcedureQuery.execute();

但是当我在单元测试下执行我的代码时,我有以下错误:

Hibernate: 
    {call saveOrUpdateTicket(?,?,?)}
2016-11-24 15:23:01.987  WARN 13456 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42883
2016-11-24 15:23:01.988 ERROR 13456 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: function saveorupdateticket(bytea, unknown, integer) does not exist
  Indice : No function matches the given name and argument types. You might need to add explicit type casts.
  Position : 15

为什么Hibernate会尝试拨打saveorupdateticket(bytea, unknown, integer)而不是saveorupdateticket(bytea,timestamp without time zone,integer)

PS:我使用java.sql.Datejava.sql.TimeStamp进行了测试但没有成功!

我正在使用:

  • Spring boot 1.4.0.RELEASE(Hibernate 5.0.9.Final和我添加了hibernate-java8)
  • PostgreSQL 9.4.1209.jre7

谢谢!

2 个答案:

答案 0 :(得分:0)

这个怎么样:

storedProcedureQuery.setParameter(2, new Date(), TemporalType.DATE);

答案 1 :(得分:0)

我解决了因缺少架构而导致的问题。我的存储过程在模式mySchema下,Hibernate试图在default模式下找到它。我必须在存储过程声明中指定模式,如下所示:

StoredProcedureQuery storedProcedureQuery = msidEntityManager.createStoredProcedureQuery("mySchema.saveOrUpdateTicket");

一切正常!