Quarkus调用Oracle存储过程时quarkus.hibernate-orm.proc.param_null_passing不生效问题
问题原因
- 你使用的
quarkus.hibernate-orm.proc.param_null_passing既不是合法的查询提示(hint)键,也不是Quarkus官方支持的Hibernate配置项,因此会抛出「未识别配置键」的警告,该配置写法完全不生效。 - Hibernate 6及以上版本默认禁止存储过程入参传递null值,你的代码中位置7、8的入参被赋值为null,又没有为对应参数单独开启空值传递权限,因此触发
IllegalArgumentException异常,异常提示中也明确要求需要调用ParameterRegistration#enablePassingNulls(true)。
解决方案
方案1:单查询单独配置(推荐)
仅针对需要传null的参数开启空值传递权限,无需改动全局配置,修改代码如下:
- 删掉代码中无效的
query.setHint("quarkus.hibernate-orm.proc.param_null_passing", true);行 - 在注册可能为null的参数时,追加
enablePassingNulls(true)调用
修改后的代码示例:
StoredProcedureQuery query = em.createStoredProcedureQuery("{ ? = call mypackage.myprocedure(?,?,?,?,?,?,?,?,?)} "); query.registerStoredProcedureParameter(1, Integer.class, ParameterMode.OUT); query.registerStoredProcedureParameter(2, Long.class, ParameterMode.IN); query.registerStoredProcedureParameter(3, String.class, ParameterMode.IN); query.registerStoredProcedureParameter(4, String.class, ParameterMode.IN); query.registerStoredProcedureParameter(5, String.class, ParameterMode.IN); query.registerStoredProcedureParameter(6, Long.class, ParameterMode.IN); // 给可能传null的第7个参数开启空值传递 query.registerStoredProcedureParameter(7, String.class, ParameterMode.IN) .enablePassingNulls(true); // 给可能传null的第8个参数开启空值传递 query.registerStoredProcedureParameter(8, String.class, ParameterMode.IN) .enablePassingNulls(true); query.registerStoredProcedureParameter(9, String.class, ParameterMode.OUT); query.registerStoredProcedureParameter(10, String.class, ParameterMode.OUT); // 后续参数赋值逻辑不变 query.setParameter(2, x); query.setParameter(3, xx); query.setParameter(4, xxxx); query.setParameter(5, ccccc); query.setParameter(6, sssss); query.setParameter(7, null); query.setParameter(8, null);
方案2:全局配置
如果项目中多个存储过程都需要传递null参数,可以直接在application.properties中添加全局配置,所有存储过程默认允许传null:
quarkus.hibernate-orm.query.pass-null-parameters=true
该配置开启后不需要再单独给参数调用enablePassingNulls(true)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

