问题描述
有这样一段代码:
StoredProcedureQuery query = this.em.createStoredProcedureQuery ("NameOfProcedure");
query.registerStoredProcedureParameter ("list_of_ids",Array.class,ParameterMode.IN);
query.setParameter (Parameters.PIECE_IDS,oracleArray (dataSource,"T_NUMBER_LIST",request.getItems (). toArray (items)));
对于eclipslink,这段代码执行成功:注册一个参数传递id列表,然后设置这个列表。在 Hibernate 的情况下,以下类型的异常:
java.lang.IllegalArgumentException:抛出类型不能为空
据我了解,Heber 不喜欢 Array.class
query.registerStoredProcedureParameter ("list_of_ids",ParameterMode.IN);
我尝试将此部分修复为 Integer []. Class
和 ArrayList.class
,但这会导致其他错误,例如:
绑定值 [oracle.sql.ARRAY@5f82399f] 不是指定的类型 [class [Ljava.lang.Integer;
或
内部转换失败:[512]
如何将列表传递给参数?
解决方法
Hibernate 不能很好地处理 SQL 数组。您必须为数组创建一个 UserType
并使用它。这篇文章的最后是一个为 Postgres 数组创建 UserType
的例子。同样的事情应该适用于 Oracle。