powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и функции
28 сообщений из 28, показаны все 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
Hibernate и функции
    #39849811
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаПусть тогда делает как все - перепаковывает в процедуру с двумя OUT
Ну еще можно перепаковать в табличный тип

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
TYPE LEO_Type AS OBJECT ( 
   funcResult VARCHAR2(10), 
   funcOutParam NUMBER 
);

TYPE LEO_Tbl AS TABLE OF LEO_Type;


--новая функция
FUNCTION Leopold (funcInParam)  -- входной параметр для исходной func
    RETURN LEO_Tbl 
  IS
  funcResult1 VARCHAR2(10);
  funcOutParam1 NUMBER;

  BEGIN
--тут вызываем исходную ф-цию(funcInParam, funcOutParam1 ) и кладем два значения в funcResult1 и funcOutParam1
    retval result := LEO_Tbl ();
    result.EXTEND;
   result( result.LAST) := LEO_Type(funcResult1, funcOutParam1);
 RETURN result;
END;


--потом используем обычный вызов любым любимым  способом

SELECT  leo.funcResult r1, leo.funcOutParam r2
 FROM(  TABLE( Leopold (funcInParam)  ) leo
  )
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849815
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заменить
retval result := LEO_Tbl (); ===> result LEO_Tbl := LEO_Tbl (); в голове функции
...
Рейтинг: 0 / 0
Hibernate и функции
    #39849844
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкатабличный типто есть в java проблемы и мы будем городить изврат в базе?
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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