Я реализую новую функцию в нашем коде, которая требует некоторых функций oracle дБ. Мы используем JPA / HQL-запросы с CriteriaBuilder и без нативных запросов, поэтому он довольно сложный и нелегко совместимый.
Мне нужны функции CAST
и REGEXP_SUBSTR
для выбора определенного значения c из поля XML.
Так что это был мой первый подход. Я попытался реализовать функции с помощью функции literal(T t)
CriteriaBuilder, например:
Expression<String> customField1 = cb.literal("CAST(REGEXP_SUBSTR(xml_data, '<CustomField>(.+?)</CustomField>', 1, 1 , NULL, 1) AS VARCHAR2(100)) AS customfield1");
Затем я реализовал выражение как multiselect
в нашем запросе, например:
.multiselect(
customField1
);
Но это не сработало, как ожидалось. У меня есть некоторые ошибки, такие как Error: Unexpected ')'
из HQL, что означает, что функции не выполняются должным образом.
Поэтому я попытался создать выражение с типом Query
, которое также будет использоваться Создание собственных запросов.
Итак, я сделал это:
Expression<Query> extract1 = cb.literal(em.createQuery("CAST(REGEXP_SUBSTR(xml_data, '<CustomField>(.+?)</CustomField>', 1, 1 , NULL, 1) AS VARCHAR2(100)) AS customfield1"));
И затем добавил его в мультиселектор. Это также дает мне ошибку, но очень странную, которую я сейчас не локализовал в журналах. Я собираюсь воспроизвести его и опубликовать здесь ошибку.
Кто-нибудь знает, как я могу добавить эти функции в запрос?