【发布时间】: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 *,因为我需要整行。我正在执行命名查询或存储过程,因为速度是一个因素。类似的存储过程(在具有非常简单类型的一小部分列上)非常快,它们似乎是即时的。使用Session 和Criteron 等通过典型的JDBC 操作运行此信息的正常获取需要几秒钟。它可能看起来不多,但在这个应用程序中,它很重要。
1) 有没有一种合理的方法可以将此列表从 Java 中获取到存储过程中?
2) 如果没有,当涉及到我的 xml 列时,我该如何绕过 Hibernate barfing?
【问题讨论】:
标签: java sql-server hibernate stored-procedures named-query