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 *
因为我需要整行。我正在执行命名查询或存储过程,因为速度是一个因素。类似的存储过程(在具有非常简单类型的列的一小部分上)速度如此之快,以至于看起来是即时的。 运行 通过使用 Session
和 Criteron
等的典型 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).
我需要进行命名查询或存储过程。这是来自 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 *
因为我需要整行。我正在执行命名查询或存储过程,因为速度是一个因素。类似的存储过程(在具有非常简单类型的列的一小部分上)速度如此之快,以至于看起来是即时的。 运行 通过使用 Session
和 Criteron
等的典型 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).