ProcedureCall 中的空值

tec*_*ch4 7 java parameters stored-procedures hibernate

我尝试以下代码:

    ProcedureCall call = ss.createStoredProcedureCall("servicos.CLASSIFIER_MAP");

    call.registerParameter( 1, String.class, ParameterMode.IN).bindValue(classifierString);
    call.registerParameter( 2, Long.class, ParameterMode.IN ).bindValue(totalRows);
Run Code Online (Sandbox Code Playgroud)

有时变量 totalRows 为空并出现错误

WARN:   SQL Error: 17041, SQLState: 99999
Error calling CallableStatement.getMoreResults
Run Code Online (Sandbox Code Playgroud)

可以在休眠中将空值发送到 ProcedureCall 吗?

Suk*_*uta 10

目前有两种方法可以实现您的目标:

  1. param_null_passing在您的休眠配置中将该属性设置为 true。
    <property name="hibernate.proc.param_null_passing">true</property>
    这是一个全局设置,可让您在ProcedureCall整个应用程序中传递空值。

  2. 如果您不想全局应用上述设置,请将您的代码更改为以下内容:

    ProcedureCall call = ss.createStoredProcedureCall("servicos.CLASSIFIER_MAP");
    
    call.registerParameter( 1, String.class, ParameterMode.IN).bindValue(classifierString); 
    call.registerParameter( 2, Long.class, ParameterMode.IN ).enablePassingNulls(true);
    
    call.setParameter(2,  totalRows);
    
    Run Code Online (Sandbox Code Playgroud)

来自 Hibernate 5文档

hibernate.proc.param_null_passing(默认值为false):

是否应将空参数绑定作为 ProcedureCall 处理的一部分传递给数据库过程/函数调用的全局设置。隐式 Hibernate 不会传递 null,目的是允许应用任何默认参数值。

这定义了一个全局设置,然后可以通过 org.hibernate.procedure.ParameterRegistration#enablePassingNulls(boolean) 来控制每个参数

值为真(传递 NULL)或假(不传递 NULL)。


mha*_*san 2

您可以尝试通过CallableStatement而不是调用您的存储过程ProcedureCall

并尝试利用其setNull方法将过程 IN 参数设置为 NULL。

但是对于您的回答 hibernate 是否支持传递 NULL 值,它似乎支持默认参数值而不是替换 null 值。