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
相关产品推荐
相关产品推荐

