我有一个存储过程,它接受字符串列表(并遵循存储过程的限制,according to Hibernate docs):
PROCEDURE count_active_esc(p_count OUT NUMBER, p_codes IN string_list);
其中string_list
是自定义类型:
CREATE OR REPLACE TYPE string_list IS TABLE OF VARCHAR(100)
并希望从JPA实体经理(a new feature in JPA 2.1)调用它。
我尝试使用数组:
StoredProcedreQuery query = entityManager.createNamedStoredProcedureQuery("count_active_esc");
query.registerStoredProcedureParameter("p_count", Integer.class, ParameterMode.OUT);
query.registerStoredProcedureParameter("p_codes", String[].class, ParameterMode.IN);
query.setParameter("p_codes", new String[] { "AEST" });
query.getOutputParameterValue("p_count"); // <<<<< throws an exception
并得到例外:
PLS-00306: wrong number or types of arguments in call to 'COUNT_ACTIVE_ESC'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
如果我传入一个列表:
StoredProcedreQuery query = entityManager.createNamedStoredProcedureQuery("count_active_esc");
query.registerStoredProcedureParameter("p_count", Integer.class, ParameterMode.OUT);
query.registerStoredProcedureParameter("p_codes", List.class, ParameterMode.IN); // <<<<< throws an exception
query.setParameter("p_codes", new ArrayList<String> {{ "AEST" }});
query.getOutputParameterValue("p_count");
它抛出java.lang.IllegalArgumentException: Type cannot be null
同时添加query.setHint("org.hibernate.callable", "true")
也没有帮助。
在JPA或Hibernate中执行此操作的正确方法是什么?如果不诉诸JDBC,它是否完全可能?
环境:JPA 2.1,Hibernate 4.3.5,Oracle
答案 0 :(得分:0)
将Integer.class更改为Types.INTEGER