【问题标题】:stored procedure from hibernate3 to hibernate5 with cursor causes param mismatch issues带有游标的从 hibernate3 到 hibernate5 的存储过程导致参数不匹配问题
【发布时间】:2021-08-28 04:15:54
【问题描述】:

我有使用 hibernate3 hibernateTemplate 执行存储过程的遗留代码,它使用带有 OUT 参数的 findByNamedQueryAndNamedParam 作为游标。下面是hbm映射的样子

<sql-query name="my_sql_procedure" callable="true">
    {call Schema.my_sql_procedure(?,:param1,:param2,:param3, :param4, :param5)}
  </sql-query>

Java 代码调用上述过程

List<?> errList = this.hibernateTemplate.findByNamedQueryAndNamedParam("my_sql_procedure", new String[] {
                    "param1", "param2", "param3", "param4", "param5" },
                    new Object[] { value1, value2, value3, value4,
                            value5});

以上代码在 Hibernate3 中运行良好,没有问题。

更新到 Hibernate5 后。它抛出以下错误。

org.springframework.orm.hibernate5.HibernateSystemException: Mixed parameter strategies - use just one of named, positional or JPA-ordinal strategy; nested exception is org.hibernate.engine.query.ParameterRecognitionException: Mixed parameter strategies - use just one of named, positional or JPA-ordinal strategy

我的猜测是 Hibernate5 不喜欢第一个参数 (?) 问号被作为 (?) 传递。

通过对存储过程和 Java 代码的最小更改(我在整个代码中有 50 多个存储过程),我如何使用 Hibernate5 使上述存储过程正确执行,以便它以光标作为输出参数返回正确的结果.我翻遍了,但找不到使用 hibernate5.findByNamedQueryAndNamedParam 执行以游标为 out 参数的存储过程的示例。

【问题讨论】:

    标签: java hibernate stored-procedures hibernate-mapping spring-orm


    【解决方案1】:

    您无法做任何事情来使现有代码正常工作。您将不得不使用一种或另一种方法。 Hibernate 5 不允许混合参数策略是有充分理由的。

    <sql-query name="my_sql_procedure" callable="true">
        {call Schema.my_sql_procedure(:param0,:param1,:param2,:param3, :param4, :param5)}
    </sql-query>
    
    StoredProcedureQuery query = entityManager
        .createStoredProcedureQuery("my_sql_procedure")
        .registerStoredProcedureParameter(
            "param0", Long.class, ParameterMode.OUT)
        .registerStoredProcedureParameter(
            "param1", Long.class, ParameterMode.IN)
        .registerStoredProcedureParameter(
            "param2", Long.class, ParameterMode.IN)
        .registerStoredProcedureParameter(
            "param3", Long.class, ParameterMode.IN)
        .registerStoredProcedureParameter(
            "param4", Long.class, ParameterMode.IN)
        .registerStoredProcedureParameter(
            "param5", Long.class, ParameterMode.IN)
        .setParameter("param1", value1)
        .setParameter("param2", value2)
        .setParameter("param3", value3)
        .setParameter("param4", value4)
        .setParameter("param5", value5);
     
    query.execute();
     
    Long commentCount = (Long) query.getOutputParameterValue("param0");
    

    【讨论】:

    • hibernate5中的映射和java代码应该是什么样子的?如果你把它放在这里,它也会对其他人有所帮助。
    • 好了,我只是将第一个位置参数替换为命名参数。
    • 使用 findByNamedQueryAndNamedParam 的 java 代码?
    • 我现在也添加了 java 代码,但请注意,您可以自己在线轻松找到如何执行此操作。
    • 我可以找到 50 种不同的方法在 java 中使用 hibernate 调用存储过程,但这不是我要问的。我想用 hibernate5.findByNamedQueryAndNamedParam 找到解决方案,这样我就不必对我的代码做太多改动了。任何其他选择对我来说都是太大的变化。不过感谢您的帮助。
    猜你喜欢
    • 2020-02-12
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多