Hibernate 命名查询或 SQL 服务器存储过程

Hibernate Named Query or SQL Server Stored Procedure

我需要进行命名查询或存储过程。这是来自 Java 应用程序的 运行,该应用程序通过 Hibernate 附加到 SQL 服务器。我更喜欢存储过程,但命名查询可能就足够了。

我在 SQL 服务器中有一个 table,它有一个 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 呕吐问题?

Is there a reasonable way to get this list from Java into a stored procedure?

当然可以。

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

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

将其作为 XML 文档传递给 Varchar(max) 或 NVarchar(max) 存储过程参数并使用 xml.nodes() (or the older OPENXML).