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

Yur*_*uri 7 java oracle hibernate jpa

我有一个存储过程,它接受一个字符串列表(并遵循存储过程的限制,根据Hibernate文档):

PROCEDURE count_active_esc(p_count OUT NUMBER, p_codes IN string_list);
Run Code Online (Sandbox Code Playgroud)

string_list自定义类型在哪里:

CREATE OR REPLACE TYPE string_list IS TABLE OF VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

并希望从JPA实体管理器(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
Run Code Online (Sandbox Code Playgroud)

并得到一个例外:

    PLS-00306: wrong number or types of arguments in call to 'COUNT_ACTIVE_ESC'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)

如果我传入一个列表:

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");
Run Code Online (Sandbox Code Playgroud)

它抛出 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

将 Integer.class 更改为 Types.INTEGER