使用JPA 2.1 / Hibernate 4将值列表传递给存储过程

时间:2015-07-29 16:13:03

标签: java oracle hibernate jpa

我有一个存储过程,它接受字符串列表(并遵循存储过程的限制,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

1 个答案:

答案 0 :(得分:0)

将Integer.class更改为Types.INTEGER