我正在尝试使用JPA 2.1 @NamedStoredProcedureQuery调用存储过程。 我的Entity类中有以下注释。
问题是如果我将模式声明为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
答案 0 :(得分:1)
根据此topic,您无法将空值作为参数传递。
我正在解释为JPA(特别是Hibernate)根本不支持设置null参数。看起来他们正在努力支持默认参数值,而不是在适当时替换空值。他们选择支持前者。看起来那些需要支持后者(可空值)的人必须使用java.sql.CallableStatement
你总是可以尝试将空字符串而不是null,我认为它应该可以工作。