Мне нужно сделать именованный запрос или хранимую процедуру. Это выполняется из приложения Java, которое подключено к SQL Server через Hibernate. Я бы предпочел хранимую процедуру, но именованного запроса может быть достаточно.
У меня есть таблица в 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 *
, потому что мне нужноцелый рядЯ делаю или именованный запрос или хранимую процедуру, потому что скорость является фактором. Подобные хранимые процедуры (в небольшом подмножестве столбцов с очень простыми типами) настолько быстры, что кажутся мгновенными. Выполнение обычной выборки этой информации с помощью типичных операций JDBC с Session
, Criteron
и т. Д. Занимает несколько секунд. Это может показаться немного, но в этом приложении это важно.
1) Есть ли разумный способ получить этот список из Java в хранимую процедуру?
2) Если нет,Как я могу обойти Hibernate, когда дело доходит до моего столбца XML?