我有一个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.Date
和java.sql.TimeStamp
进行了测试但没有成功!
我正在使用:
谢谢!
答案 0 :(得分:0)
这个怎么样:
storedProcedureQuery.setParameter(2, new Date(), TemporalType.DATE);
答案 1 :(得分:0)
我解决了因缺少架构而导致的问题。我的存储过程在模式mySchema
下,Hibernate试图在default
模式下找到它。我必须在存储过程声明中指定模式,如下所示:
StoredProcedureQuery storedProcedureQuery = msidEntityManager.createStoredProcedureQuery("mySchema.saveOrUpdateTicket");
一切正常!