Java Hibernate调用具有时间戳参数类型的PostgreSQL存储过程

Java Hibernate调用具有时间戳参数类型的PostgreSQL存储过程,java,postgresql,hibernate,stored-procedures,spring-boot,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的storedpro

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

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

        DECLARE
            ....
        END;
        $$ LANGUAGE plpgsql;
我想使用Hibernate的
storedprocedurequiry
从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尝试调用
saveorUpdatecket(bytea,未知,整数)
而不是
saveorUpdatecket(bytea,不带时区的时间戳,整数)

PS:我用
java.sql.Date
java.sql.TimeStamp
进行了测试,但没有成功


我正在使用:

  • Spring boot 1.4.0.RELEASE(Hibernate 5.0.9.Final,我添加了Hibernate-java8)
  • PostgreSQL 9.4.1209.jre7
谢谢大家!

这个怎么样:

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

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

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

一切都很好

我对它进行了测试,但没有成功。您应该使用一个简单的SELECT语句调用它:
selectsaveorupdatecket(…)
不需要StoreProcedureQuery。但是如果您这样做了,您需要用
java.sql.Timestamp
注册第二个参数,而不是
java.util.Date
,并且您还需要传递
java.sql.Timestamp
我用Timestamp测试过,但错误是相同的。Hibernate尝试使用未知参数而不是时间戳调用存储过程。或者,您可以为DB用户设置
搜索路径
,这样您就不必完全限定所有名称。建议不错。非常感谢。