powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и функции
25 сообщений из 28, страница 1 из 2
Hibernate и функции
    #39840268
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция, которая имеет один входной и один выходной параметры. Я нашла в интернете, как можно вызвать функцию с входными параметрами через NativeQuery (Например, https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)

Но у меня есть еще и выходной параметр. Насколько я понимаю, в этом случае можно попробовать обойтись чистым jdbc (получить через сессию коннект и работать с ним)
Но, возможно, есть еще какие-то варианты?
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840276
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viollin...Я нашла в интернете...
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)
...
Но у меня есть еще и выходной параметр...

Вроде и зрение у меня плохое и очки до сих пор не купил, но смотрю в браузер по Вашей же ссылке и вижу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(
    1,
    Long.class,
    ParameterMode.IN
)
.registerStoredProcedureParameter(
    2,
    Long.class,
    ParameterMode.OUT
)
.setParameter(1, 1L);
 
query.execute();
 
Long commentCount = (Long) query.getOutputParameterValue(2);
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840372
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev, это хранимая процедура. А у меня функция. Она кроме in и out имеет еще return.
Насколько я понимаю, выделенный вами код не позволяет получить возвращаемое значение. Поправьте меня, пожалуйста, если ошибаюсь
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840397
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViollinА у меня функциядай ссыль какая база и что там за функция и почему не хранимка.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840421
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp, какую именно вам ссылку надо?
База оракловая.
Насколько я помню, хранимая процедура не возвращает значение (речь про return). Хранимая функция умеет возвращать значение.
Вопрос в том, что представленный код для хранимой процедуры не умеет возвращать значение. Или же я не нашла нужного метода?
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840445
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK
И функции и процедуры коротко обзывают хранимками.
Теперь ждем ошибку на выше код что вам дали.
Вы пробуйте, думать будте после ошибки.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840490
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC SharpOK
И функции и процедуры коротко обзывают хранимками.
Теперь ждем ошибку на выше код что вам дали.
Вы пробуйте, думать будте после ошибки.

Не совсем понимаю, как адаптировать функцию под этот код.
Функция, соответственно {? = call func (?, ?) }

По аналогии с jdbc
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("func")
.registerStoredProcedureParameter(
    1,
    String.class,
    ParameterMode.OUT
)
.registerStoredProcedureParameter(
    2,
    Long.class,
    ParameterMode.IN
)
.registerStoredProcedureParameter(
    3,
    String.class,
    ParameterMode.OUT
)
.setParameter(2, 1L);
 
query.execute();
 
String result= (String) query.getOutputParameterValue(1);



Получаю ошибку PLS-00306 ошибочно число или типы аргументов при обращении к 'func'
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840498
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viollin,
Теперь дайте заголовок хранимки - create proc....
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840503
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViollinLeonid Kudryavtsev, это хранимая процедура. А у меня функция. Она кроме in и out имеет еще return.
Насколько я понимаю, выделенный вами код не позволяет получить возвращаемое значение. Поправьте меня, пожалуйста, если ошибаюсь
Любую ф-цию можно переделать в анонимный блок
Примерно так (не проверял):
Код: plsql
1.
2.
3.
4.
5.
6.
declare
  x_result number;
begin
  x_result := my_function( :param1, :param2 );
  :param3 := x_result;
end;


p.s. возможно ошибаюсь с точкой запятой после последнего end. Никогда не помнил, когда нужна точка с запятой, когда не нужна. Проще проверить оба варианта, чем в доке ковырятся ))).
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840519
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.p.s.
Как минимум PL/SQL блок можно попытаться скормить в
createNativeQuery
интерфейс Query так же замечательно имеет и set и getParameter методы

p.p.p.s.
Eclipse и java на компьютере стоит, но с hibernate дел обычно не имею. Если выложите __рабочий__ и __полный__ test case проекта с вызовом какой нибудь stored procedure, то тогда смогу скомпилировать и посмотреть более предметно.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840524
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поискал в гугле, сходу Hibernate примера не нашел.
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/

Another approach is to call the database function using plain JDBC API:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION fn_count_comments (
    postId IN NUMBER )
    RETURN NUMBER
IS
    commentCount NUMBER;
BEGIN
    SELECT COUNT(*) INTO commentCount
    FROM post_comment
    WHERE post_id = postId;
    RETURN( commentCount );
END;


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Session session = entityManager.unwrap( Session.class );
 
Integer commentCount = session.doReturningWork(
    connection -> {
    try (CallableStatement function = connection
        .prepareCall(
            "{ ? = call fn_count_comments(?) }" )) {
        function.registerOutParameter( 1, Types.INTEGER );
        function.setInt( 2, 1 );
        function.execute();
        return function.getInt( 1 );
    }
} );
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840754
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC SharpViollin,
Теперь дайте заголовок хранимки - create proc....

Код: plsql
1.
2.
3.
create or replace FUNCTION func(in_param IN NUMBER, out_param OUT VARCHAR2) 
   RETURN VARCHAR2
   IS result VARCHAR2(130);



Функция рабочая и нормально отрабатывает на jdbc

Leonid Kudryavtsevпоискал в гугле, сходу Hibernate примера не нашел.
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/

Если вы обратите внимание, то ссылку на этот сайт я давала еще в самом первом посте. Как и указывала на то, что можно сделать, уйдя с hibernate на jdbc. Но вопрос был о том, можно ли избежать как раз того кода, что вы привели.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840765
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViollinПолучаю ошибкутеперь найдите пример с jpa 2.1 и сделайте его. То есть сделайте по книжке. А потом уже свой.
И стек ошибки нужна давать полный.
https://forum.hibernate.org/viewtopic.php?f=1&t=1006663&view=next
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840777
Viollin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC SharpViollinПолучаю ошибкутеперь найдите пример с jpa 2.1 и сделайте его. То есть сделайте по книжке. А потом уже свой.
И стек ошибки нужна давать полный.
https://forum.hibernate.org/viewtopic.php?f=1&t=1006663&view=next
А не могли бы вы привести пример кода для функции? Или хотя бы ссылку на такой код, потому что я примеров с функциями не нашла(
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840787
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viollin,
Я дал ссыль. Там возврат класса конечно, но вы его сделайте и потом пробуете на простой тип.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840789
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viollin,

List <Reference> l = q.getResultList ();
Функция?
...
Рейтинг: 0 / 0
Hibernate и функции
    #39840791
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viollin,
Ссылок не найдете так задача странная. Хранимки и ОРМ.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39841012
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViollinНо вопрос был о том, можно ли избежать как раз того кода, что вы привели.
Теоретически, createNativeQuery вроде для этого и придумано

практически, проверять банально лень, у меня минимум часа 2-3 на проверку уйдит, под рукой никакого hibernate проекта нет
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849518
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
100 летвОбед, а про SingleResult забыли? Мало вас в водонапорной башне учили? Там это все было.

Код: java
1.
2.
String result = (String) entityManager.createNativeQuery(  "SELECT my_function( :param1, :param2 ) from dual")
    .setParameter("param1", 1).setParameter("param2", 1).getSingleResult();
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849637
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViollinЕсть функция, которая имеет один входной и один выходной параметры. Я нашла в интернете, как можно вызвать функцию с входными параметрами через NativeQuery (Например, https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)

Но у меня есть еще и выходной параметр. Насколько я понимаю, в этом случае можно попробовать обойтись чистым jdbc (получить через сессию коннект и работать с ним)
Но, возможно, есть еще какие-то варианты?
Я голосую за последний пункт. За чистый jdbc если он просто работает. Простой расчет. Короткий стек - просто ловить
ошибки. Длинный стек jdbc+Hibernate - больше потенциальных мест для ошибок.

Вообще хибернейт пришел из другой вселенной. Из вселенной JPA/ORM где вообще нет такого понятия как хранимая процедура.
Более того. Чистые хибернейт решения не примемлют хранимки как таковые и выкашивают их из проекта косой или топором.

Поэтому само по себе желание - странное и его надо обсуждать на самом верхнем уровне. Тоесть на уровне лиц которые
определяют дизайн и архитектуру всего проекта в целом.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849683
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ голосую за последний пункт. За чистый jdbc если он просто работает. Простой расчет. Короткий стек - просто ловить
ошибки. Длинный стек jdbc+Hibernate - больше потенциальных мест для ошибок.

Вообще хибернейт пришел из другой вселенной. Из вселенной JPA/ORM где вообще нет такого понятия как хранимая процедура.
Более того. Чистые хибернейт решения не примемлют хранимки как таковые и выкашивают их из проекта косой или топором.

Поэтому само по себе желание - странное и его надо обсуждать на самом верхнем уровне. Тоесть на уровне лиц которые
определяют дизайн и архитектуру всего проекта в целом.
"Все это, все верно" - как говорил т. Саахов. Хранимки не имеют прямой связи с ORM. Но тогда придется отказаться от хэша второго уровня. Вот Леонид должен помнить, как "затейники" пришивали параллельно к разработке на хибере еще чистых ораклистов, кэшем пал жертвой дури "архитекторов".
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849707
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном примере с функцией кеш 2 левела не нужен.
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849724
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкак разработке на хибере еще чистых ораклистов, кэшем пал жертвой дури "архитекторов".
Кэш не пал.
Кэша там изначально не было, падать было не чему.

Ну и он бы не сильно помог. Изначальный архитектор-затейник нетрадиционной ориентации живет на Западном побережье, хибернет головного мозга во всю силу (нетрадиционной - в обычном смысле этого слова, этот факт Оракл не скрывал).

p.s.
путь данных: настройка в базе -> метаописания в Java коде -> компилятор метоописаний -> XML -> парсинг в структуры при загрузке.... JS -> JSON -> XML -> дерево в Java в структуре построенная по метаописаниям -> объекты хибера -> хибер -> Cobol -> DB

Хибер через копи-буки кидал данные в Cobol -> Cobol выдавал SQL Откуда там могли остаться рабочие кэши Хибера? )))
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849727
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкаа про SingleResult забыли?....
У автора вопроса достаточно сложный случай
Ф-ция возврашающая OUT параметры. AFAIK SELECT не пойдет как класс. только анонимный блок.

p.s.
Ну и у нас Java почти нет. Все хардкоре. Forms, PL/SQL, PHP, QT
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849793
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevУ автора вопроса достаточно сложный случай
Ф-ция возврашающая OUT параметры. AFAIK SELECT не пойдет как класс. только анонимный блок.

Да, проспал. Я еще удивился что ты не ответил сразу.
Пусть тогда делает как все - перепаковывает в процедуру с двумя OUT
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]