JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - 空值给出错误

Posted

技术标签:

【中文标题】JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - 空值给出错误【英文标题】:JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - null value gives error 【发布时间】:2015-10-22 16:22:46 【问题描述】:

我正在尝试使用 JPA 2.1 @NamedStoredProcedureQuery 调用存储过程。 我的实体类中有以下注释。

问题是如果我将模式声明为 ParameterMode.IN,我将无法传递空值。只有当我将它声明为 ParameterMode.INOUT 时才能传递空值。

实体

@NamedStoredProcedureQuery(name = "employee", procedureName = "myProcedure", resultClasses = Employee.class,  parameters = 
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "EMPLOYEE_PHONE", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.INOUT, name = "CITY", type = String.class)

存储库

        public Long createOrUpdateEmployee(Employee employee) throws EbaDataException 

            StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("employee");

            query.setParameter("EMPLOYEE_PHONE", employee.getName());
            query.setParameter("CITY", employee.getCity());         
            query.execute();

        

例如,如果我使用 ParameterMode.IN 为索引 2 (CITY) 传递 null,则会收到此异常。

Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 2

【问题讨论】:

【参考方案1】:

根据topic,您不能将空值作为参数传递。

我将其解释为 JPA(特别是 Hibernate)根本不支持设置空参数。看起来他们正在努力支持默认参数值,而不是在适当的时候替换空值。他们选择支持前者。看起来那些需要支持后者(可为空值)的人必须使用 java.sql.CallableStatement

您也可以随时尝试使用空字符串而不是 null,我认为它应该可以工作。

【讨论】:

以上是关于JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - 空值给出错误的主要内容,如果未能解决你的问题,请参考以下文章

您将如何使 JPA 2.1 模块独立于 JPA 实现?

JPA 2.1 不生成模式脚本

jpa 2.1中的@ConstructorResult映射

JPA 2.1 - 无法调用 Oracle 函数

jpa 2.1 的生产就绪持久性提供程序

JPA 2.1在sql server中调用存储过程