Hibernate Named Query или хранимая процедура SQL Server - PullRequest
0 голосов
/ 14 октября 2019

Мне нужно сделать именованный запрос или хранимую процедуру. Это выполняется из приложения 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?

1 Ответ

1 голос
/ 15 октября 2019

Есть ли разумный способ получить этот список из Java в хранимую процедуру?

Конечно.

Передайте его в виде списка, разделенного запятыми, аргументу хранимой процедуры Varchar (max) или NVarchar (max) и используйте STRING_SPLIT .

Передайте его как массив JSONв аргумент хранимой процедуры NVarchar (max) и используйте OPENJSON .

Передайте его как документ XML в аргумент хранимой процедуры Varchar (max) или NVarchar (max) и используйте xml.nodes () (или более старый OPENXML ).

...