【问题标题】:Hibernate Named Query or SQL Server Stored ProcedureHibernate 命名查询或 SQL Server 存储过程
【发布时间】:2020-02-11 11:15:17
【问题描述】:

我需要进行命名查询或存储过程。这是从通过 Hibernate 连接到 SQL Server 的 Java 应用程序运行的。我更喜欢存储过程,但命名查询可能就足够了。

我在 SQL Server 中有一个表,它有一个 XML 类型的列。这本身并不重要,但它会导致问题。

我的 Hibnerate 命名查询如下所示

<sql-query name="openOrderSummary" callable="true">
    <![CDATA[
        SELECT * FROM orders
        WHERE (order_type in (:firstListOfTypes)
        OR order_type in (:secondListOfTypes))
        AND open_flag = 'true'
        AND customer_id = :customerId
        ORDER BY id DESC
    ]]>
</sql-query>

但是由于无法映射 JDBC 类型 -16 的投诉而引发异常。这没有帮助。于是我通过Hibernate代码调试,发现我的XML类型列有问题。

我更喜欢做一个存储过程,但我找不到一种不费力的方法(我自己)为order_type in (:firstListOfTypes) 部分(以及,通过扩展,第二个列表)做字符串列表。这不是一个固定的清单。它是从 Java 代码中提取的,它可能会随着新类型的添加而随时更改,因此我不能在查询中将其设为硬编码列表。

我使用select *,因为我需要整行。我正在执行命名查询或存储过程,因为速度是一个因素。类似的存储过程(在具有非常简单类型的一小部分列上)非常快,它们似乎是即时的。使用SessionCriteron 等通过典型的JDBC 操作运行此信息的正常获取需要几秒钟。它可能看起来不多,但在这个应用程序中,它很重要。

1) 有没有一种合理的方法可以将此列表从 Java 中获取到存储过程中?

2) 如果没有,当涉及到我的 xml 列时,我该如何绕过 Hibernate barfing?

【问题讨论】:

    标签: java sql-server hibernate stored-procedures named-query


    【解决方案1】:

    有没有一种合理的方法可以将此列表从 Java 中获取到存储过程中?

    当然。

    将它作为逗号分隔列表传递给 Varchar(max) 或 NVarchar(max) 存储过程参数并使用 STRING_SPLIT

    将其作为 JSON 数组传递给 NVarchar(max) 存储过程参数并使用 OPENJSON

    将其作为 XML 文档传递给 Varchar(max) 或 NVarchar(max) 存储过程参数,并使用 xml.nodes()(或更旧的 OPENXML)。

    【讨论】:

    • 如果我正确读取兼容性级别,STRING_SPLIT 和 OPENJSON 至少需要 SQL Server 2017?兼容性级别 130。如果客户有 2008 年以后的任何东西怎么办?
    • OPENJSON 和 STRING_SPLIT 在 SQL Server 2016 或更高版本上需要兼容级别 130。 XML 方法是在 SQL Server 2005 中引入的。
    • 由于客户的需要,我似乎不得不走 OPENXML 路线。如果我有一个简单的 XML 数组,格式为 &lt;types&gt;&lt;type&gt;simplestringhere&lt;/type&gt;{more elements here}&lt;/types&gt;,您是否有一个存储过程的示例?
    • 我自己必须弄清楚很多,但我根据答案中的提示让它工作了。由于客户需求,我选择了OPENXML,其中许多人使用更旧版本的 SQL Server,不支持 STRING_SPLITOPENJSON
    • .....我又回到了第一方。我仍然得到org.hibernate.MappingException: No Dialect mapping for JDBC type: -16。啊。所以从上面2)。我在休眠配置文件中有这个` exec sp_OpenOrdersSummary :ordereId, :orderTypes `。我需要返回整行,尤其是那个 XML 字段。该字段已在文件中与其他字段一起正确映射到更高的位置。 sp调用定义中是否需要声明特殊处理?
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多