我在postgreSQL数据库中有这个程序:
CREATE OR REPLACE FUNCTION getItemsForCategory(categoryId integer)
RETURNS SETOF ITEM AS $_$
DECLARE
result ITEM;
BEGIN
FOR result IN SELECT *
FROM item it
JOIN item_category itcat ON it.id = itcat.item_id WHERE itcat.category_id = categoryId LOOP
RETURN NEXT result;
END LOOP;
END; $_$ LANGUAGE 'plpgsql';
使用终端工作得很好,但我使用JPA调用它时遇到了麻烦。这是我的代码片段(4是参数cateforyId的值):
transactions.begin();
final StoredProcedureQuery storedProcedureQuery = entityManager.createStoredProcedureQuery("getItemsForCategory");
storedProcedureQuery.setParameter(1,4).execute();
final List<ItemEntity> itemEntityList = (List<ItemEntity>) storedProcedureQuery.getResultList();
transactions.commit();
运行上面的代码后,我收到此错误:
Exception in thread "main" java.lang.IllegalArgumentException:
You have attempted to set a parameter at position 1 which does not exist in this query string getItemsForCategory
有谁知道如何正确设置参数的值?我也尝试使用0而不是1来设置参数,使用其他数据类型的参数(String,Object)调用setParameter,但每次我收到熟悉的类型的错误,如那里显示的那样。非常感谢你
答案 0 :(得分:0)
您需要在设置值之前注册参数。
spq.registerStoredProcedureParameter("categoryId", int.class, ParameterMode.IN);
请参阅this link。