我们刚刚升级到hibernate 5.1.0。 完全相同的代码在4.3.6 中正常运行。我们在JPA 2.1规范中使用命名参数进行了一些oracle过程调用。在我们的例子中,我们有一个具有3个IN参数和2个OUT参数的过程。所有参数都是基本数据类型(NUMBERS或VARCHAR)。
我尝试了两种JPA 2.1 spec方法,并尝试了hibernate特定的方法。两者都因同样的原因失败了。
我们收到以下错误:
引起:java.sql.SQLException:参数名称的数量与注册的praremeters数量不匹配
我认为错误是错误的,因为。 1)因为它使用4.3.6和2)正常工作所有参数都被注册和绑定。 Out参数不受约束,但会被注册。
我们正在使用oracle jdbc驱动程序11.2.0.2。
示例代码:
public void testStoredProcedureUsingEntityManagerDirectly() {
final EntityManager em = anyBean.getEntityManager();
final StoredProcedureQuery proc = em.createStoredProcedureQuery("myschema.my_package.my_proc");
proc.registerStoredProcedureParameter("p_paramName1", String.class, ParameterMode.IN);
proc.registerStoredProcedureParameter("p_paramName2", String.class, ParameterMode.IN);
proc.registerStoredProcedureParameter("p_paramName3", String.class, ParameterMode.IN);
proc.registerStoredProcedureParameter("o_outParam1", Long.class, ParameterMode.OUT);
proc.registerStoredProcedureParameter("o_outParam2", String.class, ParameterMode.OUT);
proc.setParameter("p_paramName1", "some.name@myemail.com");
proc.setParameter("p_paramName2", "Company Name");
proc.setParameter("p_paramName3", "ABC12344444");
proc.execute();
final Long orgSeqNum = (Long) proc.getOutputParameterValue("o_outParam1");
final String activeIndicator = (String) proc.getOutputParameterValue("o_outParam2");
System.out
.println("Output: o_org_seq_num = '" + orgSeqNum + "', o_org_set_already = '" + activeIndicator + "'");
}