You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate3升级至Hibernate5调用带游标存储过程参数不匹配问题

Hibernate3升级Hibernate5存储过程混合参数报错解决方案

错误根因

报错的核心原因是Hibernate5对查询参数策略做了严格限制,禁止在同一个查询中混用位置参数(?)和命名参数(:参数名),你原有代码中第一个OUT游标参数用了位置参数,后续入参用了命名参数,不符合Hibernate5的参数规范。


最优解决方案(仅修改hbm映射,Java代码零改动)

该方案改动量最小,仅需要调整每个存储过程对应的hbm中<sql-query>的配置,原有Java调用逻辑、传参规则、返回结果格式完全和Hibernate3时期一致,不需要做任何修改。

配置修改示例

把原有sql-query中的第一个位置参数?改成命名参数,再补充返回结果的映射规则即可:

<sql-query name="my_sql_procedure" callable="true">
    <!-- 替换为实际返回的映射规则:如果返回实体就用<return class="实体全类名"/>,如果返回散列字段就用<return-scalar> -->
    <return class="com.yourproject.YourResultEntity"/>
    <!-- 把原来的位置参数?改成命名参数,名字可以自定义,比如out_cursor,不需要在Java代码中传这个参数 -->
    {call Schema.my_sql_procedure(:out_cursor,:param1,:param2,:param3, :param4, :param5)}
</sql-query>

如果存储过程返回的是没有对应实体的多列结果,可以用<return-scalar>指定每列的类型:

<sql-query name="my_sql_procedure" callable="true">
    <return-scalar column="error_code" type="java.lang.String"/>
    <return-scalar column="error_msg" type="java.lang.String"/>
    {call Schema.my_sql_procedure(:out_cursor,:param1,:param2,:param3, :param4, :param5)}
</sql-query>

可选替代方案(改动量较大,不推荐)

如果不想修改hbm文件,可以调整Java代码改用hibernateTemplate.execute的doWork方法直接调用JDBC的CallableStatement处理存储过程,但是需要修改每个存储过程的调用逻辑,适配成本更高。


内容的提问来源于stack exchange,提问作者yogidilip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:36:01